在 Java 中捕获 Ctrl+C
2022-08-31 11:03:25
是否可以在 java 命令行应用程序中捕获 + 信号?我想在终止程序之前清理一些资源。CtrlC
是否可以在 java 命令行应用程序中捕获 + 信号?我想在终止程序之前清理一些资源。CtrlC
您可以将关闭挂钩附加到 VM,只要 VM 关闭,它就会运行:
Java 虚拟机关闭以响应两种类型的事件:
当最后一个非守护程序线程退出或调用 exit(等效地称为 System.exit)方法时,程序将正常退出,或者
虚拟机在响应用户中断(如键入 Ctrl+C)或系统范围的事件(如用户注销或系统关闭)时终止。
但是,作为关闭钩子传递的线程必须遵循几个规则,因此请仔细阅读链接的文档以避免任何问题。这包括确保螺纹安全,快速终止螺纹等。
此外,正如评论者 Jesper 所指出的那样,关闭挂钩可以保证在 VM 正常关闭时运行,但如果 VM 进程被强制终止,则不会运行。如果本机代码搞砸了,或者您强行终止了进程 (, ),则可能会发生这种情况。kill -9
taskkill /f
但在这些情况下,所有的赌注都是关闭的,所以我不会浪费太多的想法。
仅用于快速控制台测试目的...
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();
}
}
});