当我的应用程序准备退出时,通过关闭窗口或调用System.exit()方法。我是否必须手动停止我可能创建的线程,否则Java会为我处理这些线程?我是否必须在Java中手动停止线程?
9
A
回答
11
如果使用System.exit()。无论它们是否守护,所有线程都会停止。
否则,JVM将自动停止由Thread.setDaemon(true)设置的后台进程线程的所有线程。换句话说,只有剩余的线程都是守护线程或根本没有线程时,jvm才会退出。
考虑下面的例子,即使主方法返回后,它仍会继续运行。 但是如果你将它设置为守护进程,它将在主方法(主线程)终止时终止。
public class Test {
public static void main(String[] arg) throws Throwable {
Thread t = new Thread() {
public void run() {
while(true) {
try {
Thread.sleep(300);
System.out.println("Woken up after 300ms");
}catch(Exception e) {}
}
}
};
// t.setDaemon(true); // will make this thread daemon
t.start();
System.exit(0); // this will stop all threads whether are not they are daemon
System.out.println("main method returning...");
}
}
3
如果您希望在退出时正常停止线程,Shutdown Hooks可能是一种选择。
的样子:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
//Stop threads }
});
参见:hook-design
相关问题
- 1. 我是否必须停止System.Timers.Timer?
- 2. 是否必须手动完成EF upsert?
- 3. 在Java中停止线程?
- 4. 线程在其父进程停止时是否会停止
- 5. 我是否必须在应用程序退出时手动关闭Executor?
- 6. Java,停止(中断)线程
- 7. 我是否必须pthread_join创建每个线程?
- 8. 如何在Java中停止线程
- 9. 如何在Java中停止线程?
- 10. 是否有必要在Activity的onStop()中停止动画?
- 11. 断点是否停止所有线程?
- 12. 这是我应该停止Java中的线程的方式吗?
- 13. 是否可以启动(并停止)DLL中的线程?
- 14. Java线程意外停止
- 15. Java线程不会停止
- 16. 如何停止Java线程?
- 17. 停止线程onclicklistener java
- 18. 我是否必须在每条线上演员?
- 19. 是否必须在我的应用程序中进行配置?
- 20. 是否必须在主线程上执行GCD主队列?
- 21. UIImageView setHighlightedImage:它是否必须在主线程上?
- 22. 是否必须在主线程上调用UIView的-drawRect?
- 23. epoll:我必须使用多线程
- 24. 我必须使用多少个线程
- 25. RichTextBox - InvalidOperationException:调用线程必须是STA
- 26. java中的多线程停止
- 27. Java中,如何停止线程
- 28. 停止或中断Java线程
- 29. 如何停止Java中的线程?
- 30. JFrame setVisibility(false)是否停止我创建的所有线程?