什么是终止永久运行的命令行Java应用程序的干净/推荐方法?

时间:2012-01-09 06:49:12

标签: java shell command-line command-line-interface

更具体地说,我有一个多线程命令行Java应用程序,它运行并收集数据,直到用户终止它。

用户终止它的明显方法是推送Control-C,但是我需要在VM中安装一个关闭钩子并处理所有线程。

是否有更好/更合适的方式让用户通知应用程序是否需要关机?

例如,有没有办法捕获其他一些组合键并在我的应用程序中设置一个布尔标志?

作为进一步的澄清,我在C中寻找与信号处理功能相似的东西。

4 个答案:

答案 0 :(得分:2)

一种方法是创建一个“监听”标准输入的新线程。根据您决定的任何键模式,该线程可以在主应用程序中设置标志。

答案 1 :(得分:1)

  

是否有更好/更合适的方式让用户通知   应用程序是时候关闭了吗?

最好的方法是使用Java Monitoring and Management

例如,请查看此post

最好不要依赖关闭钩子.java中的挂钩钩子适用于KILL -15KILL而不适用于KILL -9 HARD KILL

答案 2 :(得分:1)

考虑使用这样的关闭钩子:

Runtime.getRuntime().addShutdownHook(shutdownHook);

让您自己的代码在JVM终止于以下条件之一时运行:

  1. 程序正常退出,例如当最后一个非守护程序线程退出或调用Runtime.exit()方法时。
  2. 虚拟机响应用户中断(例如键入CTRL-C)或系统范围事件(例如用户注销或系统关闭)而终止(例如,JVM接收其中一个中断信号SIGHUP(仅限Unix),SIGINT或SIGTERM)。
  3. 您可以参考:http://www.ibm.com/developerworks/ibm/library/i-signalhandling/了解更多详情(免责声明:非常古老的文章与JDK 1.3.1有关)

答案 3 :(得分:0)

这不是特定于Java的解决方案,但在关机期间(至少在Linux上),操作系统会向所有进程发送SIGTERM(在宽限期后跟随SIGKILL)。您的应用程序应为此安装处理程序,然后正常关闭。执行此操作后,当您关闭VM时,它将自动处理。