- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在阅读关于 Java 的 setDaemon()
方法的文档,当我读到 JVM 没有等待守护线程完成就退出时感到困惑。
但是,由于本质上守护线程是 Java Thread
,它可能依赖于在 JVM 上运行来实现其功能,如果 JVM 在守护线程完成之前退出,守护线程如何生存?
最佳答案
他们无法生存。当所有线程(守护程序线程除外)都已死亡时,JVM 将退出。
当您启动您的应用程序时,JVM 将启动一个单一的非守护线程来运行您的静态 main 方法。
一旦 main 方法退出,这个主线程就会结束,如果你没有生成其他非守护线程,JVM 就会退出。
但是,如果您启动了另一个线程,JVM 将不会退出,它会等待所有非守护线程结束后再退出。
如果您生成的那个线程正在做一些重要的事情,这绝对是正确的做法,但是通常您有一些线程并不那么重要,也许它们正在监听一些可能发生也可能不发生的外部事件。
因此,理论上,您应该在某处放置一些代码来停止您生成的所有线程,以允许 JVM 退出。
由于这很容易出错,因此将此类非重要线程标记为守护进程要容易得多。如果它们被标记为这样,JVM 将不会等待它们在退出前死亡,JVM 将在“主线程”(未标记为守护进程的线程)死亡时退出并杀死这些线程。
把它放在代码中,它是这样的:
public class Spawner {
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
public void run() {
while (true) {
System.out.println("I'm still alive");
}
}
});
// Try uncommenting/commenting this line
// t.setDaemon(true);
t.start();
System.out.println("Main thread has finished");
}
}
(我没有测试过这段代码,直接写在这里,所以可能会有愚蠢的错误)。
当运行这段带有注释行的代码时,线程不是守护进程,所以即使您的 main 方法已经完成,您将继续让控制台充满,直到您使用 CTRL+C 停止它。也就是说,JVM 不会退出。
如果取消注释该行,则该线程是一个守护进程,并且在 main 方法完成后不久,该线程将被终止并且 JVM 将退出,而不需要 CTRL+C。
关于java - JVM退出后守护线程如何存活?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31252227/
我是一名优秀的程序员,十分优秀!