在 Java 中捕获 Ctrl+C

2022-08-31 11:03:25

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


答案 1

您可以将关闭挂钩附加到 VM,只要 VM 关闭,它就会运行:

Java 虚拟机关闭以响应两种类型的事件:

  • 当最后一个非守护程序线程退出或调用 exit(等效地称为 System.exit)方法时,程序将正常退出,或者

  • 虚拟机在响应用户中断(如键入 Ctrl+C)或系统范围的事件(如用户注销或系统关闭)时终止。

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

此外,正如评论者 Jesper 所指出的那样,关闭挂钩可以保证在 VM 正常关闭时运行,但如果 VM 进程被强制终止,则不会运行。如果本机代码搞砸了,或者您强行终止了进程 (, ),则可能会发生这种情况。kill -9taskkill /f

但在这些情况下,所有的赌注都是关闭的,所以我不会浪费太多的想法。


答案 2

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

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

            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                e.printStackTrace();
            }
        }
    });

推荐