![](/img/trans.png)
[英]Gui program stops after main method executes even if thread is non-daemon
[英]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处于活动状态,它就不会强制终止守护程序线程。
程序终止所有活动并在发生以下两种情况之一时退出:
不是守护程序线程的所有线程都终止。
某些线程调用类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.