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

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

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

如果我在上面的代码中不执行t.setDaemon(true);,行为将是相同的。

我正在使用Java 8。

yingjianfeng09 回答:在Java关闭挂钩中添加守护程序与非守护程序线程的区别

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

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) {
            }
        }
    }
本文链接:https://www.f2er.com/3059038.html

大家都在问