繁体   English   中英

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

[英]Difference in adding a daemon vs non-daemon thread in a java shutdown hook

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

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

如果我不做t.setDaemon(true);行为会不会一样? 在上面的代码中。

我正在使用 java 8。

关闭钩子线程是否是守护进程没有区别。

正如Runtime.addShutdownHook的规范所说,

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

一旦关闭序列开始,它只能通过调用停止方法来停止

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM