因为main()
在一个线程上运行。并且只要main()
完成,主线程应该停止。所以如果main()
已经调用了一个长时间运行的线程,即使在main()
完成了所有任务后,该线程还没有完成。由于main()
被返回,其他线程是否会被终止?我觉得不是。但为什么?如果main方法完成执行,任何长时间运行的线程会发生什么?
public static void main(String[] s){
new LongRunningThread().start();
}
因为main()
在一个线程上运行。并且只要main()
完成,主线程应该停止。所以如果main()
已经调用了一个长时间运行的线程,即使在main()
完成了所有任务后,该线程还没有完成。由于main()
被返回,其他线程是否会被终止?我觉得不是。但为什么?如果main方法完成执行,任何长时间运行的线程会发生什么?
public static void main(String[] s){
new LongRunningThread().start();
}
当没有更多非守护线程时,进程将终止,如有必要会终止任何守护线程。但是,如果的有任何非守护线程,那么这些将阻止进程终止。
将该线程标记为守护线程或用户线程。当只有运行的线程都是守护进程线程时,Java虚拟机才会退出。
该方法必须在线程启动之前调用。
的程序终止其所有活动和退出时的两件事情之一发生:
所有这一切都没有守护线程终止线程。
某些线程调用类Runtime或类System的exit方法,并且安全管理器未禁止退出操作。
在相关说明中,主线程将处于什么状态?因为它的执行是完整的,但其他线程阻止它停止。 – Ankit 2017-11-25 18:21:55
@Ankit:不,其他线程正在阻止*进程终止*。主线程已经完成并且不再存在。但是该进程继续运行,因为还有其他前台线程。 – 2017-11-25 18:37:10
如果你的长期运行的线程不是守护线程,它不会终止一旦主线程退出。 JVM继续运行线程,直到调用Runtime的退出方法(并允许运行)或所有非守护线程都已死亡。如果长时间运行的线程不是守护进程线程,则JVM不会退出(即线程将继续可用于运行)。
我刚才看到Jon的帖子 - 我建议你用它作为答案。 – 2013-05-07 18:59:09
要回答你的问题为什么,这是因为使你的线程为非守护线程意味着你不希望它突然终止,你希望它通过运行完成或以有序的方式终止或被取消。如果你的线程一旦退出主线程就被JVM杀死了,这相当于使线程成为守护进程。
只有所有非守护线程完成后,JVM才会退出。所以是的,你的程序会在你的长期任务完成后退出。 – assylias 2013-05-07 18:53:46