1

我对 Daemon 线程的了解是,如果没有用户线程在运行并且所有剩余线程都是 Daemon 类型,JVM 将退出。

当我运行下面的程序时,我总是看到输出为“主线程结束”作为第一行,打印“Hello from Worker 0”等等,直到还有几行”。

我的问题是,如果 Worker 线程被设置为守护进程,那么当主线程结束时,Worker 线程应该死掉并且不会继续,但仍然会打印“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

谢谢

4

2 回答 2

3

....但是仍然打印了“来自 Worker 0 的 Hello”和儿子在线,并且在一段时间后只有 JVM 结束,为什么它的行为是这样的?

最可能的解释是,工作线程要么在 JVM 注意到主线程已经退出之前,要么在作为 JVM 关闭的一部分进行其他清理工作时将这些行写入 System.out 缓冲区。

但归根结底,额外的输出不太可能很重要,所以我建议你忽略它。(消除它可能相当困难......)

于 2012-10-07T10:45:43.007 回答
2

在打印该行后主线程立即退出的任何地方都不能真正保证,因此仍然可能存在守护线程可以打印某些内容的时间窗口。

于 2012-10-07T11:26:11.347 回答