2013-05-07 26 views
10

因为main()在一个线程上运行。并且只要main()完成,主线程应该停止。所以如果main()已经调用了一个长时间运行的线程,即使在main()完成了所有任务后,该线程还没有完成。由于main()被返回,其他线程是否会被终止?我觉得不是。但为什么?如果main方法完成执行,任何长时间运行的线程会发生什么?

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

只有所有非守护线程完成后,JVM才会退出。所以是的,你的程序会在你的长期任务完成后退出。 – assylias 2013-05-07 18:53:46

回答

7

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

Thread.setDaemon

将该线程标记为守护线程或用户线程。当只有运行的线程都是守护进程线程时,Java虚拟机才会退出。

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

而且从section 12.8 of the JLS

的程序终止其所有活动和退出时的两件事情之一发生:

  • 所有这一切都没有守护线程终止线程。

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

+0

在相关说明中,主线程将处于什么状态?因为它的执行是完整的,但其他线程阻止它停止。 – Ankit 2017-11-25 18:21:55

+1

@Ankit:不,其他线程正在阻止*进程终止*。主线程已经完成并且不再存在。但是该进程继续运行,因为还有其他前台线程。 – 2017-11-25 18:37:10

1

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

+0

我刚才看到Jon的帖子 - 我建议你用它作为答案。 – 2013-05-07 18:59:09

1

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

相关问题