守护进程线程行为java

时间:2012-10-07 10:36:48

标签: java multithreading

我对守护程序线程的了解是,如果没有运行用户线程且所有剩余线程都是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

由于

2 个答案:

答案 0 :(得分:3)

  

....但仍然是“Hello from Worker 0”并且线上的儿子被打印出来,经过一段时间只有JVM结束,为什么它会像这样?

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

但是在一天结束时,额外的输出不太可能,所以我建议你忽略它。 (消除它可能相当困难......)

答案 1 :(得分:2)

在打印该行之后主线程立即退出的任何地方都没有真正保证,所以仍然可以有一个时间窗口,守护程序线程可以打印一些东西。