因为main()
在线程上运行。并且一旦main()
完成,主线程应该停止。因此,如果main()
调用了一个长时间运行的线程,即使在main()
完成所有任务之后也尚未完成。既然main()
被返回了,其他线程会被终止吗?我觉得不是。但为什么?
public static void main(String[] s){
new LongRunningThread().start();
}
因为main()
在线程上运行。并且一旦main()
完成,主线程应该停止。因此,如果main()
调用了一个长时间运行的线程,即使在main()
完成所有任务之后也尚未完成。既然main()
被返回了,其他线程会被终止吗?我觉得不是。但为什么?
public static void main(String[] s){
new LongRunningThread().start();
}
当没有更多的非守护线程时,该进程将终止,必要时终止任何守护线程。但是,如果您确实有任何非守护线程,它们将阻止进程终止。
将此线程标记为守护线程或用户线程。当唯一运行的线程都是守护线程时,Java 虚拟机退出。
此方法必须在线程启动之前调用。
当发生以下两种情况之一时,程序会终止其所有活动并退出:
所有不是守护线程的线程都会终止。
某些线程调用了Runtime类或System类的exit方法,安全管理器没有禁止exit操作。
要回答您的问题为什么,这是因为使您的线程成为非守护线程意味着您不希望它突然终止,您希望通过运行完成或被取消来有序地终止它。如果您的线程在 main 退出后被 JVM 杀死,则相当于使该线程成为守护进程。
如果您的长时间运行的线程不是守护线程,则一旦主线程退出,它就不会终止。JVM 继续运行线程,直到调用 Runtime 的 exit 方法(并允许运行)或所有非守护线程都已死亡。如果您长时间运行的线程不是守护线程,JVM 将不会退出(即线程将继续可用于运行)。