我对优雅地关闭 Java 命令行程序的不同方法感兴趣。发送终止信号不是一种选择。
我可以想到几种不同的方法。
- 打开一个端口并等待连接。制作完成后,优雅地关机。
- 注意要创建的文件,然后关闭。
- 从终端读取一些输入,例如“执行关机”。
第三个并不理想,因为经常有节目输出被泵送到屏幕上。第一个需要太多努力(我很懒)。大多数程序员是否使用第二种选择?如果没有,还有什么可能/优雅/简单?
我对优雅地关闭 Java 命令行程序的不同方法感兴趣。发送终止信号不是一种选择。
我可以想到几种不同的方法。
第三个并不理想,因为经常有节目输出被泵送到屏幕上。第一个需要太多努力(我很懒)。大多数程序员是否使用第二种选择?如果没有,还有什么可能/优雅/简单?
你可以尝试这样的事情:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() { /*
my shutdown code here
*/ }
});
编辑:
关闭钩子不会执行应用程序的关闭。相反,它为开发人员提供了一种在关机时执行他/她希望进行的任何清理的方法。
来自 JavaDoc for Runtime(如果您打算使用此方法,请阅读):
关闭挂钩只是一个已初始化但未启动的线程。当虚拟机开始其关闭序列时,它将以某种未指定的顺序启动所有已注册的关闭挂钩并让它们同时运行。当所有钩子都完成后,如果 finalization-on-exit 已启用,它将运行所有未调用的终结器。最后,虚拟机将停止。...
你可以尝试使用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 虚拟机关闭以响应两种事件:
第二个选项的好处 - 检查文件 - 第一个 - 监听端口 - 是你有一些安全的可能性。
您可以在创建文件的目录上设置权限,以便只有适当的用户才能关闭程序。如果您在端口上侦听,任何用户都可以连接到它。
如果您想使用套接字版本,则实现起来非常简单。这是代码:
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 u 10 或更高版本,您可以使用 JVisualVM 执行相同的操作。
我建议使用关闭挂钩。它将允许您使用标准操作系统工具来控制您的程序。它也不需要对外部资源(磁盘、端口等)的任何额外访问。