我已经在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) {
}
}
}