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变量也是同一个。
对这话我不太明白 继承的就不不是访问的同一变量了?

解决方案 »

  1.   

    补充 书上打印的结果是那个调用了接口的程序打印的index的值是有次序排列下来的程序结果 继承的那个没给结果
    但是我用自己的电脑打印的却是继承的是按顺序的接口的反倒乱。不知道为什么。觉的和书给的结论不一样呢 ? 我的电脑是超线程的对这结果不知道有没有影响
    强行停止在命令提示符中是 ctrl+c要运行程序的朋友注意一下不然的话会眼花的。
      

  2.   

    你的第一个例子是两个线程一起运行的,有两个线程应该是一直处于等待的。
    那两个线程一起更改index的值所以输出结果会乱,而不是顺序的。
    第二个例子,只是一个线程而已,虽然你start了四次,但只有一个start真正启动了线程
      

  3.   

    为什么你想要的结果应该是创建4个线程,要4个线程共同完成index值变化且没有重复的过程。采用接口,就相当于为同一个任务开辟了4个线程,4个线程共同完成任务。而用继承,则4个线程不相关,各自运行,达不到合作的效果呢?
      

  4.   

    你的第二个会报错,同一个线程调用2次start会出错。用继承也能实现共享一个变量的,写个内部类就行了。
      

  5.   

    用内部类是能解决共享变量的问题但是我想知道的是这里的
    为什么Runnable可以达到共享同一个变量的?而继承的没达到共享同一个变量呢?
      

  6.   

    继承的那个 把index + static 就可以了