在 java 关闭钩子中添加守护程序与非守护程序线程的区别



我在stackoverflow中看到过这个讨论。但是我不清楚在ShutdownHook中将线程标记为守护进程是否与将其标记为非守护进程相同?

Thread t = new Thread(this::someMethod, "shutdown_hook");
t.setDaemon(true);
Runtime.getRuntime().addShutdownHook(t);

如果我不t.setDaemon(true);上面的代码中执行,行为会相同吗?

我正在使用java 8。

无论关闭钩子线程是否是守护程序,都没有区别。

正如Runtime.addShutdownHook规范所说,

当虚拟机开始其关闭序列时,它将启动 所有注册的关闭钩子都以某种未指定的顺序让它们 并发运行。当所有钩子完成后,它将运行 所有未调用的终结器(如果已启用退出时终结(。 最后,虚拟机将停止。请注意,守护程序线程将 在关闭序列期间继续运行,非守护程序也是如此 线程(如果关闭是通过调用 exit 方法启动的(。

一旦关机序列开始,它只能通过 调用 halt 方法

JDK 实现遵循这些规则。正如我们在源代码中看到的,runHooks启动钩子线程并等待所有钩子线程完成:

    for (Thread hook : threads) {
        hook.start();
    }
    for (Thread hook : threads) {
        while (true) {
            try {
                hook.join();
                break;
            } catch (InterruptedException ignored) {
            }
        }
    }

最新更新