【发布时间】:2015-11-25 17:51:52
【问题描述】:
当 JVM 以 System.exit(0) 或 ^C 或类似的东西终止时会发生什么?我读过诸如“进程刚刚被吹走”和“每个线程都停止了”之类的东西,但我想知道究竟发生了什么。我已经知道shutdownHook 仍然会以某种方式被执行,但是在调用shutdownHooks 之前会发生什么以及在所有这些线程完成后会发生什么?
我想正确实现这样的shutdownHook,为此我需要对哪些仍然可以执行,哪些不会执行做出正确的假设。
更新:
一些代码:
class SomeObject {
private boolean stopped;
SomeObject() {
stopped = false;
Thread hook = new Thread() {
@Override
public void run() {
stopped = true;
}
};
hook.setPriority(Thread.MAX_PRIORITY);
Runtime.getRuntime().addShutdownHook(hook);
}
boolean map(Iterator<Object> it) {
while(it.hasNext() && !stopped) {
writeToOtherObject(it.next());
it.remove();
}
//have calculations finished?
return !it.hasNext();
}
}
map 函数计算在其他对象中收集的结果。这个对象应该在一切都被分解之前存储在某个文件中(也可以通过普通优先级shutdownHooks)。这里的shutdownHook 有意义吗?据我了解,首先销毁所有线程,然后才运行shutdownHooks(同时,但我假设首先运行高优先级线程......),然后最终确定对象。这使得上面的代码相当无用,因为这个shutdownHook 的目的是确保在关闭已经开始时没有启动新的循环。我的理解是否正确和完整?
【问题讨论】:
-
这能回答你的问题吗? blog.joda.org/2014/02/exiting-jvm.html
-
您是否需要比Runtime.exit documentation 中的信息更多的信息?如果有,哪一部分不清楚?
-
JVM什么时候终止?进程继续运行。
-
绝对不会发生的情况是线程被
Thread.stop()停止。它们就像被Thread.destroy()停止一样。 -
@RealSkeptic 关闭顺序是我正在寻找的方向,但我也很好奇正在运行的线程会发生什么(如Marko Topolnik 所示)。我会用一个例子来更新我的问题