更新:
现在,为了清楚起见,情况是:存在一个仅通过调用A类中的main()函数启动的项目,并且在main()中添加了关闭挂钩。
A启动许多其他工作线程,它们一直运行直到执行ShutdownHook。
我的问题是如何让关机挂钩执行?我们曾经使用kill -9 PID来杀死进程。而且我不确定关闭钩子会直接被杀死执行。
我搜了很多,大多数人说用kill -9正确关机会被忽略吗?但是我的同事说我们很长时间以来一直在使用这种方式来停止服务...我现在完全感到困惑。
public class A {
//...omitted unrelevant
public static void main(String[] args) {
final A ctrl = new A(configName, routerId);
ctrl.startup();
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
if (logger.isWarnEnabled()) {
logger.warn("Kill signal received, starting shutdown...");
}
ctrl.shutdown(); //calling the real shutdown
if (logger.isWarnEnabled()) {
logger.warn("Shutdown done, going down.");
}
Set<Thread> threadSet=Thread.getAllStackTraces().keySet();
String currentThreadName = Thread.currentThread().getName();
for (Thread thread : threadSet) {
if (logger.isWarnEnabled()) {
logger.warn("Killing : " + thread.getName() + " " + thread.getClass().getName());
}
if (!thread.getName().equals(currentThreadName)) {
thread.stop();
}
}
System.exit(0);
}
}
}
// ...
public void shutdown() {
if (logger.isDebugEnabled()) {
logger.debug("requesting shutdown");
}
for (Worker w : worker) {
w.requestShutdown();
}
for (Thread t : workerThreads) {
try {
t.join();
} catch (InterruptedException e) {
}
}
if (logger.isDebugEnabled()) {
logger.debug("shutdown finished");
}
}}
最佳答案
根据kiheru的建议使用SIGINT信号。这就是您按Ctrl + C时发送的内容。
http://en.wikipedia.org/wiki/Unix_signal
关于java - 如何触发Java关机 Hook 以保持进程运行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27178498/