在Java中捕获Ctrl + C

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (43)

是否有可能在java命令行应用程序中捕获Ctrl+ C信号?我想在终止程序之前清理一些资源。

提问于
用户回答回答于

您可以将关闭挂接附加到VM关闭时运行的VM:

Java虚拟机响应两种事件而关闭:

  • 程序正常退出时,最后一个非守护进程线程退出或退出(等效地,System.exit)方法被调用时,或者
  • 响应用户中断(如键入Ctrl+ C)或系统范围事件(如用户注销或系统关闭)终止虚拟机。

但是,作为关闭钩子传递的线程必须遵循几条规则,因此请仔细阅读链接文档以避免任何问题。这包括确保线程安全,线程的快速终止等。

另外,正如Jesper指出的那样,关闭挂钩保证在虚拟机正常关闭的情况下运行,但如果虚拟机进程强行终止,则不会。如果原生代码出现故障或者您强行终止进程(kill -9taskkill /f),则可能发生这种情况。

但是在这些情况下,所有的赌注都无济于事,所以我不会浪费太多的思考。

用户回答回答于

仅用于快速控制台测试目的...

Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
            try {
                Thread.sleep(200);
                System.out.println("Shouting down ...");
                //some cleaning up code...

            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });

扫码关注云+社区