更新:
现在,为了清楚起见,情况是:存在一个仅通过调用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/

10-10 09:08