如果main方法完成执行,那么任何长时间运行的线程会发生什么?

时间:2013-05-07 18:51:27

标签: java multithreading

因为main()在一个线程上运行。一旦main()完成,主线程应该停止。因此,如果main()已经调用了一个长期运行的线程,即使在main()完成所有任务之后该线程尚未完成。由于返回main(),其他线程会被终止吗?我觉得不是。但为什么呢?

public static void main(String[] s){    
    new LongRunningThread().start();
}

3 个答案:

答案 0 :(得分:8)

当没有更多非守护程序线程时,进程将终止,必要时终止任何守护程序线程。但是,如果您执行有任何非守护程序线程,那么这些将阻止进程终止。

来自Thread.setDaemon

  

将此线程标记为守护程序线程或用户线程。当运行的唯一线程都是守护程序线程时,Java虚拟机将退出。

     

必须在线程启动之前调用此方法。

来自section 12.8 of the JLS

  

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

     
      
  • 所有非守护程序线程的线程都将终止。

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

  •   

答案 1 :(得分:1)

如果长时间运行的线程不是守护程序线程,则一旦主线程退出,它将不会终止。 JVM继续运行线程,直到调用Runtime的exit方法(并允许运行)或所有非守护程序线程都已死亡。如果长时间运行的线程不是守护程序线程,JVM将不会退出(即线程将继续可用于运行)。

答案 2 :(得分:1)

回答你的问题为什么,这是因为让你的线程成为非守护进程线程意味着你不希望它突然终止,你希望它以有序的方式终止运行完成或被取消。如果你的线程在退出main之后被JVM杀死,这相当于使线程成为守护进程。