在Java中捕获Ctrl + C.

时间:2009-10-23 07:49:11

标签: java command-line control-c

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

3 个答案:

答案 0 :(得分:79)

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

  

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

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

  •   
  • 虚拟机将响应用户中断而终止,例如键入 Ctrl + C 或系统范围的事件,例如用户注销或系统关闭。

  •   

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

此外,正如评论者Jesper指出的那样,关闭挂钩保证在VM正常关闭时运行,但如果VM进程被强制终止则不会。如果本机代码搞砸了或强行终止进程(kill -9taskkill /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仍然存在。