1、
class MultiThread
{
public static void main(String[] args)
{
MyThread mt=new MyThread();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
}
}
class MyThread implements Runnable
{
int index=0;
public void run()
{
while(true)
{
System.out.println(Thread.currentThread().getName()+":"+index++);
}
}
}
2
class MultiThread
{
public static void main(String[] args)
{
MyThread mt=new MyThread();
mt.start();
mt.start();
mt.start();
mt.start();
}
}
class MyThread extends Thread
{
int index=0;
public void run()
{
while(true)
{
System.out.println(getName()+":"+index++);
}
}
}
以上是两个线程运行的程序,书上说要多用接口的那种,继承的那个程序每一个线程类的对象里都有index变量的值所以没办法达到同一变量的共享的目的。而做为接口的那个程序的4个线程因为mt作为参数传入的对象是同一个对象,所以访问的index变量也是同一个。
对这话我不太明白 继承的就不不是访问的同一变量了?
问题补充:补充 书上打印的结果是那个调用了接口的程序打印的index的值是有次序排列下来的程序结果 继承的那个没给结果
但是我用自己的电脑打印的却是继承的是按顺序的接口的反倒乱。不知道为什么。觉的和书给的结论不一样呢 ? 我的电脑是超线程的对这结果不知道有没有影响
强行停止在命令提示符中是 ctrl+c要运行程序的朋友注意一下不然的话会眼花的。是不是我那个继承的方法没有实现多线程呢? 因为我的U是支持超线程的所以才把现在多线程的程序的线程搞乱了而没实现的就执行一个线程就不会乱呢 ? 为什么你想要的结果应该是创建4个线程,要4个线程共同完成index值变化且没有重复的过程。采用接口,就相当于为同一个任务开辟了4个线程,4个线程共同完成任务。而用继承,则4个线程不相关,各自运行,达不到合作的效果呢?
class MultiThread
{
public static void main(String[] args)
{
MyThread mt=new MyThread();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
}
}
class MyThread implements Runnable
{
int index=0;
public void run()
{
while(true)
{
System.out.println(Thread.currentThread().getName()+":"+index++);
}
}
}
2
class MultiThread
{
public static void main(String[] args)
{
MyThread mt=new MyThread();
mt.start();
mt.start();
mt.start();
mt.start();
}
}
class MyThread extends Thread
{
int index=0;
public void run()
{
while(true)
{
System.out.println(getName()+":"+index++);
}
}
}
以上是两个线程运行的程序,书上说要多用接口的那种,继承的那个程序每一个线程类的对象里都有index变量的值所以没办法达到同一变量的共享的目的。而做为接口的那个程序的4个线程因为mt作为参数传入的对象是同一个对象,所以访问的index变量也是同一个。
对这话我不太明白 继承的就不不是访问的同一变量了?
问题补充:补充 书上打印的结果是那个调用了接口的程序打印的index的值是有次序排列下来的程序结果 继承的那个没给结果
但是我用自己的电脑打印的却是继承的是按顺序的接口的反倒乱。不知道为什么。觉的和书给的结论不一样呢 ? 我的电脑是超线程的对这结果不知道有没有影响
强行停止在命令提示符中是 ctrl+c要运行程序的朋友注意一下不然的话会眼花的。是不是我那个继承的方法没有实现多线程呢? 因为我的U是支持超线程的所以才把现在多线程的程序的线程搞乱了而没实现的就执行一个线程就不会乱呢 ? 为什么你想要的结果应该是创建4个线程,要4个线程共同完成index值变化且没有重复的过程。采用接口,就相当于为同一个任务开辟了4个线程,4个线程共同完成任务。而用继承,则4个线程不相关,各自运行,达不到合作的效果呢?
用接口实现线程,一个对象可创建多个线程。由于多个线程共享一个对象,所以对象的资源可以在线程间共享(如这题的index值);
用继承实现线程,一个对象就是一个线程,所以不能达到共享资源的目的。你的第二个程序中,企图连用四个mt.start();启动四个线程是错误的,因为你用的是同一个对象其实只启动了一个线程(不信的话,你可看运行结果的线程名字,它始终都为Thread-0),三个mt.start();是重复的,多余的。 要用这种方法启动四个线程,就要创建四个对象,然后启动:
MyThread mt1=new MyThread();
MyThread mt2=new MyThread();
MyThread mt3=new MyThread();
MyThread mt4=new MyThread();
mt1.start();
mt2.start();
mt3.start();
mt4.start();
继承的4个线程是按顺序"index++"输出的 也就是共用一个的
实现接口的线程index是相互各不相干的
我是这样认为的 原因一时说不上
按代码理解应该是 继承实现时 生成一个mt对象 当然 只一个index 然后这个对象运行4次run()
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start(); 它们传入的参数都是mt 所以这四个线程共享index