是否可以在java命令行应用程序中捕获 Ctrl + C 信号?我想在终止程序之前清理一些资源。
答案 0 :(得分:79)
您可以将shutdown hook附加到VM,只要VM关闭,它就会运行:
Java虚拟机关闭以响应两种事件:
当最后一个非守护程序线程退出或调用exit(等效,System.exit)方法时,程序正常退出,或者
虚拟机将响应用户中断而终止,例如键入 Ctrl + C 或系统范围的事件,例如用户注销或系统关闭。
作为关闭钩子传递的线程必须遵循几个规则,因此请仔细阅读链接文档以避免任何问题。这包括确保线程安全,快速终止线程等。
此外,正如评论者Jesper指出的那样,关闭挂钩保证在VM正常关闭时运行,但如果VM进程被强制终止则不会。如果本机代码搞砸了或强行终止进程(kill -9
,taskkill /f
),就会发生这种情况。
但在这些情况下,所有投注都是关闭的,所以我不会过多考虑它。
答案 1 :(得分:23)
仅用于快速控制台测试......
strconv.ParseInt
答案 2 :(得分:1)
最佳答案建议使用关闭钩子。关机钩比它们值得的麻烦要多得多。它们以不确定的顺序运行,并且您所依赖的库可能会添加自己的关闭挂钩,这可能意味着在您的关闭挂钩运行之前,您自己的关闭挂钩所依赖的内容可能会被取消初始化。减轻您的头痛,并使用信号处理程序:
<LinkHOC to='/path' text='Redirect' active={true} /}
Signal.handle(new Signal("INT"), // SIGINT
signal -> System.out.println("Interrupted by Ctrl+C"));
当前为Signal
,这意味着它已被弃用-但它所替换的名称当前为sun.misc.Signal
,因此直到Java团队弄清楚如何公开公开以非内部方式通知信号处理程序,请注意该调用可能会消失。尽管目前(从JDK 11开始),jdk.internal.misc.Signal
仍然存在。