我知道所有恶魔线程在主要退出后终止。但是,如果有一些非守护进程线程在主要退出后继续运行怎么办?运行此非守护程序线程是否会阻止所有其他守护程序线程终止?
恶魔线程在主要退出后继续运行,并且还有一些非守护程序线程仍在运行?
答案 0 :(得分:0)
当所有非守护程序线程都已停止时,运行时将关闭。因此,如果启动另一个非守护程序线程(例如事件队列),则应用程序将继续运行。
答案 1 :(得分:0)
守护程序线程在JVM终止之前不会关闭。
只要没有线程调用System.exit并且仍有任何非守护程序线程仍在运行,JVM就不会终止。
所以,是的,运行非守护程序线程会阻止JVM关闭,只要JVM处于活动状态,它就不会强制守护程序线程终止。
来自the Java Language Specification, 12.8 Program Exit:
程序会终止其所有活动,并在发生以下两种情况之一时退出:
所有非守护程序线程的线程都将终止。
某些线程调用类Runtime或类System的exit方法,安全管理器不禁止退出操作。
因此,请务必确保您的线程正确关闭。在一个项目中,我有一个后台线程,定期写入文件,我试图弄清楚为什么文件的内容发生了巨大的变化。原因是后台线程没有被关闭所以它仍然坚持做下去,即使新启动的应用程序也写入文件。做ps -af | grep java
表明有两个java进程正在运行,其中应该有一个。
答案 2 :(得分:-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%忙,那就不行。