日期:2014-05-20  浏览次数:20603 次

关于守护线程的问题(来源于scjp)
为什么下面这段程序没有输出呢(把setDaemon注释掉或把sleep时间缩短则可以输出),哪位朋友帮忙解答一下,谢谢!

public class A extends Thread {
A() {
setDaemon(true);
}

public void run() {
(new B()).start();
try {
Thread.sleep(600);
} catch (InterruptedException x) {
x.printStackTrace();
}
System.out.println("A done");
}

public static void main(String[] args) {
(new A()).start();

}
}

class B extends Thread {
public void run() {
try {
Thread.sleep(600);
} catch (InterruptedException x) {
x.printStackTrace();
}
System.out.println("B done");
}
}

------解决方案--------------------
看下面这篇帖子的讨论应该就知道为什么啦。
A线程还没执行完时JVM就已经退出啦,当你把sleep的时间设短了,短于JVM的exit时间,就能看到期望中的打印。
http://topic.csdn.net/t/20060109/00/4504934.html
------解决方案--------------------
注意:当只剩下Daemon线程时,JVM会退出。

我们来分析一下程序:
首先构造Test,并且线程被daemonized了。
然后Test开始run,同时JVM也开始检测线程是不是只剩下Daemon线程。
然后构造B病开始run,Test和B开始sleep,注意两个都是Daemon线程。所以只要CPU轮到JVM检测,就会退出。
这个时间差大概在20-30 milliseconds。
明白了没?