Java 如何强制调用addShutdownHook(…)

Java 如何强制调用addShutdownHook(…),java,Java,我希望一个线程能够连续接收来自kafka的消息,并且我希望在按下ctrl+C时关闭executor,但似乎没有调用addShutdownHook(…)方法 如何确保它将被调用?非常感谢 public class wwwwwwww { static ExecutorService executor = Executors.newFixedThreadPool(2); static { Runtime.getRuntime().addShutdownHook(new

我希望一个线程能够连续接收来自kafka的消息,并且我希望在按下ctrl+C时关闭executor,但似乎没有调用addShutdownHook(…)方法

如何确保它将被调用?非常感谢

public class wwwwwwww {
    static ExecutorService executor = Executors.newFixedThreadPool(2);
    static {
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                Logger.getGlobal().info("***************destroying");
                executor.shutdownNow();
            }
        });
    }

    public static void main(String[] args) throws Exception {
        executor.submit(new Runnable() {
            @Override
            public void run() {
                Logger.getGlobal().info("If you see this log message, then logging is configured correctly and you should see the shutdown hook message.");
                while (true) {
                    Logger.getGlobal().info("Inside loop");
                    // ConsumerRecords<String, String> records = consumer.poll(100);
                    // for (ConsumerRecord<String, String> record : records) {
                    // System.out.printf("offset = %d, key = %s, value = %s\n", record.offset(), record.key(), record.value());
                    // }
                }
            }
        });
    }
}
公共类WW{
静态ExecutorService executor=Executors.newFixedThreadPool(2);
静止的{
Runtime.getRuntime().addShutdownHook(新线程(){
公开募捐{
Logger.getGlobal().info(“*********************”正在销毁”);
执行者。关机现在();
}
});
}
公共静态void main(字符串[]args)引发异常{
执行者提交(新的可运行(){
@凌驾
公开募捐{
Logger.getGlobal().info(“如果您看到此日志消息,那么日志记录配置正确,您应该看到关机挂钩消息。”);
while(true){
Logger.getGlobal().info(“内部循环”);
//ConsumerRecords记录=consumer.poll(100);
//对于(消费者记录:记录){
//System.out.printf(“偏移量=%d,键=%s,值=%s\n”,record.offset(),record.key(),record.value());
// }
}
}
});
}
}
作为对的响应,关闭挂钩没有运行,因为您正在终止IDE中运行的进程:这意味着您的程序从未收到任何信号(请参阅),因此从逻辑上讲,关闭挂钩永远不会执行(请参阅,了解挂钩运行时间的说明)


TL;DR:不要在IDE内测试系统接口功能(例如捕捉信号);从命令行“正确”运行程序。

此代码的可能副本与我的机器上假定的完全相同;这真的只是一个独立的Java应用程序吗?你到底是如何执行代码的?您真的在向JVM发送一个消息吗?请提供一个。@erratlinguist,谢谢你的帮助,我在IDE中点击停止按钮,没有任何破坏性的信息输出。可能是重复的谢谢,我通过命令行测试了它,结果与IDE相同。好吧,我在Eclipse中构建了上面的代码,使用
File->Export…Runnable Jar File
将其导出到
ww.Jar
,然后使用bash使用
java-Jar-ww.Jar
运行它,钩子工作正常;您正在使用Windows吗?在中,已经声明不可能在Windows中可靠地发送中断信号。