多线程守护进程线程行为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
谢谢
# 1 楼答案
在任何地方都不能保证主线程在打印该行后立即退出,因此仍然可能存在一个时间窗口,守护进程线程可以在该时间窗口中打印某些内容
# 2 楼答案
最可能的解释是工作线程将这些行写入系统。在JVM注意到主线程已退出之前,或者在JVM关闭期间,正在进行其他清理工作时,请退出缓冲区
但归根结底,额外的产出不太重要,所以我建议你忽略它。(消除它可能相当困难…)