优雅地关闭Java命令行程序的最佳方法

23 java command-line shutdown

我对优雅地关闭Java命令行程序的不同方法感兴趣.发送终止信号不是一种选择.

我可以想到几种不同的方法.

  1. 打开端口并等待连接.制作一个,优雅地关闭.
  2. 观察要创建的文件,然后关闭.
  3. 从终端读取一些输入,例如"执行关闭".

第三个是不理想的,因为经常将程序输出泵送到屏幕.第一个需要付出太多努力(我很懒).大多数程序员使用第二种选择吗?如果没有,还有什么可能/优雅/简单?

akf*_*akf 20

你可以尝试这样的事情:

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() { /*
       my shutdown code here
    */ }
 });
Run Code Online (Sandbox Code Playgroud)

编辑:

关闭钩子不会执行应用程序的关闭.相反,它为开发人员提供了一种方法来执行他/她在关机时所希望的任何清理.

来自JavaDoc for Runtime(如果您计划使用此方法,请阅读以下内容):

关闭钩子只是一个初始化但未启动的线程.当虚拟机开始其关闭序列时,它将以某种未指定的顺序启动所有已注册的关闭挂钩,并让它们同时运行.当所有挂钩都完成后,如果启用了finalization-on-exit,它将运行所有未读取的终结器.最后,虚拟机将停止....

  • 这如何关闭他的程序? (2认同)

dfa*_*dfa 9

你可以试着用Runtime.getRuntime().addShutdownHook()它来满足你的要求.通过这种方式,您可以注册一个钩子来执行清理,以便执行正常关闭.

编辑

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)public void addShutdownHook(Thread hook)注册新的虚拟机关闭钩.Java虚拟机关闭以响应两种事件:

  • 当最后一个非守护程序线程退出或调用退出(等效,System.exit)方法时,程序正常退出,或者
  • 响应于用户中断(例如,键入^ C)或系统范围的事件(例如用户注销或系统关闭),终止虚拟机.

  • 注意-Xrs java命令行选项:它屏蔽SIGINT,SIGTERM,SIGHUP和SIGQUIT. (4认同)

Dav*_*ebb 5

第二个选项 - 检查文件 - 超过第一个 - 监听端口 - 的好处是你有一定的安全可能性.

您可以在创建文件的目录上设置权限,以便只有适当的用户才能关闭该程序.如果您在端口上侦听任何用户都可以连接到它.


aka*_*okd 2

前两个选项很容易实现。您还可以使用一些 JMX 东西(我对此不太了解)。Tomcat 使用第一种方法,我在我的两个项目中应用了 1 和 2。