我有功能的Java程序,它需要定期运行。但是,我希望能够关闭包装程序(如果您是UNIX用户,请在终端窗口或SIGTERM中考虑Ctrl + C),而不会有任何中断包装程序启动的主程序进程或线程的风险。
起初,我想我应该让我的主程序在每一轮处理之后的一段时间内进入休眠状态。然后我发现,如果程序需要关闭并且被用户手动中断,那么在处理数据时它可能会被中断,并且输出文件会被切断或损坏。
我在想最好的方法是编写一个包装程序(可能也是用Java)来调用主程序。如果有东西关闭了包装器,我希望主程序的派生线程或程序实例保持打开状态,直到它们准备好关闭为止。另外,主程序的最多一个实例应该随时运行。
这是我想什么我的包装做(在伪代码):
每n分钟: 如果主程序的实例在运行,什么也不做 别的产卵的主要程序的一个实例。
在关闭: 离开主程序运行完,如果它正在运行
我应该使用Java运行时对象/库(有效的命令行)运行我的主程序,或者我应该改变我的主程序实现Runnable并让包装程序产生运行我的主程序的线程?
编辑(可能的解决方案?):
目前我正在考虑使用Java运行时对象调用使用exec功能的主程序(见http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html和http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html)。要确定主程序是否已经在运行,我可以使用Process.exitValue()函数。如果它抛出IllegalThreadStateException,那么主程序仍在运行。
一个解决方案是不使用控制-C。所有的软件都通过JMX按钮关闭。这使我们能够正确地关闭我们的类,而不必在JVM陷入困境时这样做。 – Gray 2012-04-25 14:24:16
我的程序将从终端/控制台运行,它没有GUI。 – user1258361 2012-04-25 14:32:06
没关系。您仍然可以轻松发布JMX按钮,甚至可以使用JMX命令行客户端关闭应用程序。 – Gray 2012-04-25 14:33:04