有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程守护进程线程行为java

关于守护进程线程,我所知道的是,如果没有用户线程运行,并且所有剩余线程都是守护进程类型,JVM将退出

当我运行下面的程序时,我总是将输出视为“主线程结束”作为第1行,并打印“来自Worker 0的Hello”,依此类推,直到最后几行”

我的问题是,如果将工作线程设置为守护进程,那么当主线程结束时,工作线程应该停止运行,但仍然会打印“来自工作线程0的Hello”和子线程,并且在一段时间后,只有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) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    .... but still "Hello from Worker 0" and son on lines are printed and after some time only JVM end, why it is behaving like this?

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

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