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