在Thinking in Java 多线程这章中有个多线程的例子:
public class SimpleThread extends Thread{
private  int countDown=5;
private static int threadCount = 0;
private int threadNumber = ++threadCount;

public SimpleThread(){
System.out.println("Making" + threadNumber);
}

public void run(){
while (true){
System.out.println("Thread" + 
threadNumber + "(" + countDown + ")");
if (--countDown ==0) return;
}
}

public static void main(String[] args){
for(int i = 0;i < 5;i++)
new SimpleThread().start();
System.out.println("All Thread Started");
}
}现在有个问题是:我在把变量countDown前面也加上static,程序变成死循环。能帮我解析下其中的原因吗?谢谢了!

解决方案 »

  1.   

    某个线程启动后使得countDown<0,其他线程检测if (--countDown ==0)的时候不满足条件,不会return,所以一直循环。static使得countDown在所有线程间共享。
      

  2.   

    楼主可以将          if (--countDown ==0) return;
    改为
             if (--countDown ==0){
               System.out.println(countDown);
               return;
            }这样能更清楚的看到结果。
      

  3.   

    首先,要知道的是,static数据就意味着:无论你创建多少个对象,这些对象都共享同一份内存空间。也就是说,不同的对象,读到的static数据都是同一个值!本程序中,若把countDown改成static
    执行for(int i = 0;i  < 5;i++) 
            new SimpleThread().start(); 时,
    当i=0时,执行一次new SimpleThread().start(); 自动调用SimpleThread 的read(),然后直到countDown=0时退出read(),此时,countDown的值为0;
    当i=1时,再次执行new SimpleThread().start(); 自动调用SimpleThread 的read(),由于countDown变成是static,所以此时,新的线程读到的countDown值是0,这就是导致死循环的原因。因为在进行if (--countDown ==0)判断时,countDown前自减变成-1,永远不等于0。
      

  4.   

    static的话 5个线程共用这个变量了,这样只有一个线程当countDown==0时退出循环,其后countDown都为负数,其他线程就不会退出了
      

  5.   

    把return 该为break  有什么不同?》
      

  6.   

    因为你把变量countDown前面也加上static后,countDown变量变成5个线程共享,5个线程运行run()后都会对countDown操作,另外由于 if (--countDown ==0) return; 中的++操作是先计算后比较,此时的countDown值可能已经小于0,所以会死循环
    解决方法:
    修改if (--countDown ==0) return; 为if (countDown-- <=0) return