关于守护线程的问题(来源于scjp)

yuepengfei 2008-02-21 10:32:44
为什么下面这段程序没有输出呢(把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");
}
}
...全文
66 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
91大白兔奶糖 2008-02-21
  • 打赏
  • 举报
回复
注意:当只剩下Daemon线程时,JVM会退出。

我们来分析一下程序:
首先构造Test,并且线程被daemonized了。
然后Test开始run,同时JVM也开始检测线程是不是只剩下Daemon线程。
然后构造B病开始run,Test和B开始sleep,注意两个都是Daemon线程。所以只要CPU轮到JVM检测,就会退出。
这个时间差大概在20-30 milliseconds。
明白了没?
favorite7w 2008-02-21
  • 打赏
  • 举报
回复
看下面这篇帖子的讨论应该就知道为什么啦。
A线程还没执行完时JVM就已经退出啦,当你把sleep的时间设短了,短于JVM的exit时间,就能看到期望中的打印。
http://topic.csdn.net/t/20060109/00/4504934.html

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧