我对守护程序线程的了解是,如果没有运行用户线程且所有剩余线程都是Daemon类型,JVM将退出。
当我运行下面的程序时,我总是看到输出为“主线程结束”作为第1行,并打印“Hello from Worker 0”,依此类推,直到几行“。
我的问题是,如果将工作线程设置为守护进程,那么当主线程结束时,工作线程应该死并且不会继续但仍然是“Hello from Worker 0”并且线路上的儿子被打印并且在一段时间之后只有JVM结束,为什么表现得像这样?
如果我的问题无效,我很抱歉,但我想知道答案并怀疑。
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
new WorkerThread().start() ;
System.out.println("Main Thread ending") ;
}
}
class WorkerThread extends Thread {
public WorkerThread() {
setDaemon(true) ;
}
public void run() {
int count=0 ;
while (true) {
System.out.println("Hello from Worker "+count++) ;
count++;
}
}
}
Main Thread ending
Hello from Worker 0
Hello from Worker 2
Hello from Worker 4
Hello from Worker 6
Hello from Worker 8
由于
答案 0 :(得分:3)
....但仍然是“Hello from Worker 0”并且线上的儿子被打印出来,经过一段时间只有JVM结束,为什么它会像这样?
最可能的解释是,工作线程在JVM注意到主线程退出之前,或者在JVM关闭时进行其他清理工作时,将这些行写入System.out缓冲区。
但是在一天结束时,额外的输出不太可能,所以我建议你忽略它。 (消除它可能相当困难......)
答案 1 :(得分:2)
在打印该行之后主线程立即退出的任何地方都没有真正保证,所以仍然可以有一个时间窗口,守护程序线程可以打印一些东西。