在Java中捕获Ctrl + C

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

您可以将closures挂钩附加到VMclosures时运行的VM:

Java虚拟机响应两种事件closures:

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

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

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

而且,正如评论者Jesper指出的那样,closures挂钩保证在虚拟机正常closures的情况下运行,但是如果虚拟机进程被强制终止,则不会。 这可能会发生,如果本地代码拧紧或如果你强行杀死进程( kill -9taskkill /f )。

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

只是为了快速进行控制台testing…

 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(); } } });