我已经在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方法启动了关闭操作)。





一旦关闭顺序开始,则只能通过以下方式停止它:
调用停止方法


JDK实现遵循以下规则。正如我们在source code中所见,runHooks启动钩子线程,并等待它们全部完成:

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

10-08 13:20