繁体   English   中英

在主线程退出后,恶魔线程继续运行,并且还有一些非守护程序线程还在运行?

[英]Demon threads continue to run after main exited and there is some non-daemon thread still running?

我知道所有Demon线程在主出口退出后都会终止。 但是,如果有一些非守护线程在main退出后继续运行,该怎么办? 运行此非守护程序线程是否会阻止所有其他守护程序线程终止?

在主线程退出后,恶魔线程继续运行,并且还有一些非守护程序线程还在运行?

当所有非守护程序线程都停止时,运行时将关闭。 因此,如果您启动另一个非守护程序线程(例如事件队列),则应用程序将继续运行。

在JVM终止之前,守护程序线程不会关闭。

只要没有线程调用System.exit并且有任何非守护进程线程仍在运行,JVM就不会终止。

因此,是的,运行的非守护程序线程可以防止JVM关闭,并且只要JVM处于活动状态,它就不会强制终止守护程序线程。

Java语言规范的12.8程序退出

程序终止所有活动并在发生以下两种情况之一时退出:

  • 不是守护程序线程的所有线程都终止。

  • 某些线程调用类Runtime或System类的exit方法,并且安全管理器不禁止退出操作。

因此,请确保确保正确关闭线程。 在一个项目中,我有一个定期写入文件的后台线程,并且我试图弄清为什么文件内容发生了巨大变化。 究其原因,是因为后台线程没有关闭,因此即使新启动的应用程序也在向文件写入数据,后台线程也始终保持运行状态。 ps -af | grep java ps -af | grep java表明,有2个Java进程在运行,应该有1个。

为什么不自己检查呢?

public static void main(String[] ...){
Thread t1=new Thread(()=>{for(;;);});
t1.setDeamon(true);

Thread t2=new Thread(()=>{for(;;){System.out.println(new Date())}});
t2.setDeamon(false);

t1.start();
t2.start();
Thread.currentThread().sleep(1000);
}

并检查JVM是否终止。 如果您的CPU 100%忙,则不忙。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM