12

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

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

3 回答 3

10

当没有更多的非守护线程时,该进程将终止,必要时终止任何守护线程。但是,如果您确实有任何非守护线程,它们将阻止进程终止。

来自Thread.setDaemon

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

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

JLS 的第 12.8 节

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

  • 所有不是守护线程的线程都会终止。

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

于 2013-05-07T18:52:56.800 回答
1

要回答您的问题为什么,这是因为使您的线程成为非守护线程意味着您不希望它突然终止,您希望通过运行完成或被取消来有序地终止它。如果您的线程在 main 退出后被 JVM 杀死,则相当于使该线程成为守护进程。

于 2013-05-07T19:03:00.227 回答
1

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

于 2013-05-07T18:58:30.887 回答