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

时间:2018-05-11 17:33:32

标签: java

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

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

3 个答案:

答案 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%忙,那就不行。