gpt4 book ai didi

java - JVM退出后守护线程如何存活?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:07:50 24 4
gpt4 key购买 nike

我正在阅读关于 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com