JVM如何终止守护程序线程?或者如何编写正常终止的守护程序线程

Aar*_*ang 28 java multithreading jvm daemon

假设场景:
我有一个守护程序线程负责一些I/O,主线程完成并返回,JVM决定终止我的守护程序线程.

它是如何做到的?打断?最终确定?如何对我的守护程序线程进行编码,以便在终止时能够优雅地做出反应?

小智 11

我刚刚编写了以下代码作为测试:

public class DaemonThreadPlay {
    public static void main(String [] args) {
        Thread daemonThread = new Thread() {
            public void run() {
                while (true) {
                    try {
                        System.out.println("Try block executed");
                        Thread.sleep(1000l);
                    } catch (Throwable t) {
                        t.printStackTrace();
                    }
                }
            }

            @Override
            public void finalize() {
                System.out.println("Finalize method called");
            }
        };
        daemonThread.setDaemon(true);
        daemonThread.start();

        try {
            Thread.sleep(2500l);
        } catch (Throwable t) {
            //NO-OP
        }
    }
}    
Run Code Online (Sandbox Code Playgroud)

我将断点放在守护程序线程的catch块和finalize方法中.即使执行了try块,也没有达到断点.显然这段代码有同步/计时问题,但我认为我们可以安全地得出结论,守护程序线程在关闭时不会被中断,也不一定会调用它们的finalize()方法.

您始终可以向JVM运行时添加关闭挂钩:

Thread shutdownHook = ... // construct thread that somehow
                          // knows about all the daemon threads
Runtime.getRuntime().addShutdownHook(shutdownHook);
Run Code Online (Sandbox Code Playgroud)

您的关闭钩子显然可以执行"正常"关闭所需的任何任务.

  • 如果显式调用`System.gc()`并且未设置JVM选项`-XX:+ DisableExplicitGC`,则守护程序线程将退出.这意味着垃圾收集器负责在所有用户线程完成后关闭守护程序线程. (2认同)

use*_*272 5

我想你误解了一个守护程序线程是什么.

看看java中的守护程序线程是什么

总之,它基本上意味着守护程序线程不应该执行任何I/O或持有任何资源.如果您违反了这个基本规则,那么您的线程就不能成为守护程序线程.

添加关闭挂钩是确保在JVM终止之前调用代码的标准方法,但即使这样也不是100%保证 - 例如,您的JVM可能会崩溃,让操作系统以保护操作系统的方式整理资源,但很可能会使您的应用程序处于不一致/错误状态.

系统检查点和恢复机制可以追溯到软件的早期阶段(例如操作系统和批处理操作),不幸的是,这个轮子不断重新发明,因为没有"银弹"方法(API)可以解决这个问题.通用的方式.

  • 对不起,我不同意.只要知道一个守护程序线程可以在处理中被杀死,就没有危险,除非你知道一些关于java资源泄漏的事情,我不知道. (2认同)
  • 如果守护线程拥有数百个资源,那么终止 JVM 是很疯狂的,更糟糕​​的是,当它处于一系列关键写入操作的中间时会发生关闭。您实际上是在冒着应用程序一致性的风险。您也不同意写了“实践中的 Java 并发”的 Brian Goetz ……不同意也没关系,但是我认为在极少数情况下您可能是对的。 (2认同)