【发布时间】:2014-08-27 19:17:48
【问题描述】:
java.lang.Thread.setDaemon(boolean)
当唯一运行的线程都是守护线程时,Java 虚拟机退出。
然而,在下面的代码中,“安全关闭”在中断(操作系统风格)进程时永远不会发生 不,我没有使用 SIGKILL...
由于文档错误 (?) 是我唯一的办法来跟踪所有非守护线程并在关闭挂钩中加入它们吗?
public class Main {
public static void main(String... args) {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
System.out.println("shutdown hook activated");
}
});
new Thread(new Runnable() {
public void run() {
while (true) {
try {
System.out.println("sleeping for 1000 seconds!");
Thread.sleep(1000000);
} catch (InterruptedException e) {
System.out.println("INTERRUPTED");
break;
}
}
System.out.println("SAFELY SHUTTING DOWN");
}
}).start();
}
}
【问题讨论】:
-
文档没有错。从逻辑上讲,“当唯一运行的线程都是守护线程时,Java 虚拟机退出”确实不暗示它在其他情况下也不会关闭。
-
文档的含义已经解释过了,所以你的例子与文档并不矛盾。
-
"一旦关机程序开始,它只能通过调用停止方法来停止,该方法会强制终止虚拟机。"关闭钩子文档非常清楚您不能使用它来停止关闭这一事实(如果您阅读文档的其余部分,您会看到漏洞,但是非常脆弱)
-
Oracle documentation 同时提到了
SIGINT和abrupt termination。您还知道关闭挂钩可能永远不会被调用吗? -
@user3338098 你没有得到“与文档所说的相反”。正如我所说,您引用的文档并没有说明或暗示您要解决的问题。你在不合逻辑地解释它。具体来说,您是在否认前件。 en.wikipedia.org/wiki/Denying_the_antecedent
标签: java multithreading interrupt shutdown-hook interrupted-exception