块引用
我有一个需要定期运行的 Java 程序。但是,我希望能够关闭包装程序(如果您是 UNIX 人员,请在终端窗口或 SIGTERM 中使用 Ctrl+C),而不会中断包装程序将启动的主程序进程或线程。
起初我在想我应该让我的主程序在每轮处理后休眠一段时间。然后我想如果程序需要关闭并且被用户手动中断,它可能在处理数据时被中断,并且输出文件会被切断或损坏。
我认为最好的方法是编写一个调用主程序的包装程序(可能也在Java中)。如果某些东西关闭了包装器,我希望我的主程序的衍生线程或程序实例保持打开状态,直到它们准备好正确关闭。此外,任何时候最多只能运行一个主程序实例。
这是我希望我的包装器执行的操作(在伪代码中):
每 n 分钟:如果主程序的实例正在运行,则不执行任何其他操作来生成主程序的实例。
On Close:如果主程序正在运行,则让主程序运行完成
我应该使用 Java Runtime 对象/库来运行我的主程序(有效地从命令行)还是应该更改我的主程序以实现 Runnable 并让包装程序产生运行我的主程序的线程?
编辑(可能的解决方案?):
目前我正在考虑使用 Java Runtime 对象使用 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 则主程序仍在运行。