最好的办法正常关闭一个Java命令行程序最好的办法正常关闭一个Java命令行程序(Best Way

2019-05-13 15:09发布

我感兴趣的是不同的方法来正常关闭Java命令行程序。 发送一个kill信号是不是一种选择。

我能想到的几种不同的方法。

  1. 打开一个端口,等待连接。 当一个人作出,正常关闭。
  2. 留意要创建一个文件,然后关机。
  3. 从终端读取某些输入,诸如“执行关闭”。

第三个是不理想的,因为经常有程序输出泵浦到屏幕上。 第一个就是,太多的精力(我懒)。 难道大多数程序员使用第二个选项? 如果没有,还有什么是可能的/优雅/简单吗?

Answer 1:

你可以尝试这样的事:

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

编辑:

关闭挂钩不会在应用程序下进行关闭。 相反,它使开发人员进行任何清理,他/她希望在关机的方式。

根据JavaDoc的运行时 (很好看的,如果你打算使用此方法):

关闭钩子只是一个初始化但尚未启动的线程。 当虚拟机开始关闭序列,它会启动所有已注册的关闭钩子在一些未指定的顺序,并让它们同时运行。 当所有的钩子已经完成了它就会运行所有未调用的终结,如果最后确定,在退出已启用。 最后,虚拟机将暂停。 ...



Answer 2:

你可以尝试使用Runtime.getRuntime().addShutdownHook()应该满足你的所需。 通过这种方式,你可以注册一个钩子做清理,以perfom一个gracefull关机。

编辑

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)公共无效addShutdownHook(挂线)注册新的虚拟机来关闭钩。 Java虚拟机关闭响应两种事件:

  • 在程序正常退出,当最后一个非守护线程退出时或者当(等同于System.exit)方法被调用的出口处,或
  • 虚拟机被终止在响应于用户中断,如打字^ C,或一个全系统的事件,如用户注销或系统关闭。


Answer 3:

第二种选择的好处 - 检查一个文件 - 在第一 - 端口上监听 - 是你有安全性的某种可能性。

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



Answer 4:

如果你想要去与插槽的版本,这是很容易实现。 下面的代码:

ServerSocket server = new ServerSocket(8080);
System.out.println("Socket listening!");
server.accept();
System.out.println("Connection received!");

你可以很容易地嵌入在你开始你的程序一个单独的线程的代码,然后把它修改全局状态启动关机。



Answer 5:

前两个选项是很容易实现。 你也可以使用一些JMX的东西(我不知道很多关于这一点)。 Tomcat使用第一种方法,我在我的两个项目中的应用1和2。



Answer 6:

考虑具有JMX组件。 然后你就可以与JConsole的连接本地或通过网络,并与您的组件通信。 然后,该组成部分能够正常关闭程序。

在Java 6ü10或更高版本,你可以用JVisualVM相同。



Answer 7:

我会建议使用shutdown钩子。 它可以让你的程序都使用标准的OS工具来控制。 它也并不需要外部资源(磁盘,端口,等等)的任何其他访问。



文章来源: Best Way to Gracefully Shutdown a Java Command Line Program