我感兴趣的是不同的方法来正常关闭Java命令行程序。 发送一个kill信号是不是一种选择。
我能想到的几种不同的方法。
- 打开一个端口,等待连接。 当一个人作出,正常关闭。
- 留意要创建一个文件,然后关机。
- 从终端读取某些输入,诸如“执行关闭”。
第三个是不理想的,因为经常有程序输出泵浦到屏幕上。 第一个就是,太多的精力(我懒)。 难道大多数程序员使用第二个选项? 如果没有,还有什么是可能的/优雅/简单吗?
我感兴趣的是不同的方法来正常关闭Java命令行程序。 发送一个kill信号是不是一种选择。
我能想到的几种不同的方法。
第三个是不理想的,因为经常有程序输出泵浦到屏幕上。 第一个就是,太多的精力(我懒)。 难道大多数程序员使用第二个选项? 如果没有,还有什么是可能的/优雅/简单吗?
你可以尝试这样的事:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() { /*
my shutdown code here
*/ }
});
编辑:
关闭挂钩不会在应用程序下进行关闭。 相反,它使开发人员进行任何清理,他/她希望在关机的方式。
根据JavaDoc的运行时 (很好看的,如果你打算使用此方法):
关闭钩子只是一个初始化但尚未启动的线程。 当虚拟机开始关闭序列,它会启动所有已注册的关闭钩子在一些未指定的顺序,并让它们同时运行。 当所有的钩子已经完成了它就会运行所有未调用的终结,如果最后确定,在退出已启用。 最后,虚拟机将暂停。 ...
你可以尝试使用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虚拟机关闭响应两种事件:
第二种选择的好处 - 检查一个文件 - 在第一 - 端口上监听 - 是你有安全性的某种可能性。
您可以在其中创建该文件,以便只有适当的用户可以关闭程序的目录设置的权限。 如果你听一个端口上的任何用户都可以连接到它。
如果你想要去与插槽的版本,这是很容易实现。 下面的代码:
ServerSocket server = new ServerSocket(8080);
System.out.println("Socket listening!");
server.accept();
System.out.println("Connection received!");
你可以很容易地嵌入在你开始你的程序一个单独的线程的代码,然后把它修改全局状态启动关机。
前两个选项是很容易实现。 你也可以使用一些JMX的东西(我不知道很多关于这一点)。 Tomcat使用第一种方法,我在我的两个项目中的应用1和2。
考虑具有JMX组件。 然后你就可以与JConsole的连接本地或通过网络,并与您的组件通信。 然后,该组成部分能够正常关闭程序。
在Java 6ü10或更高版本,你可以用JVisualVM相同。
我会建议使用shutdown钩子。 它可以让你的程序都使用标准的OS工具来控制。 它也并不需要外部资源(磁盘,端口,等等)的任何其他访问。