1

块引用

我有一个需要定期运行的 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.htmlhttp: //docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html)。要确定主程序是否已经在运行,我可以使用 Process.exitValue() 函数。如果它抛出 IllegalThreadStateException 则主程序仍在运行。

4

2 回答 2

1

当您的应用程序获得 SIGINT (Control-C) 时,您可以使用关闭挂钩执行有序关闭:请参阅Runtime.addShutdownHook(...).

然而,这并不涉及 SIGKILL、JVM 崩溃、操作系统崩溃和硬电源故障。实际上,在这种情况下,应用程序不可能完全关闭。为此,您需要设计您的应用程序以使用强大的持久性机制定期保持其状态。

于 2012-04-25T14:36:02.393 回答
0

创建一个以静态方式设置某些标志的新线程。该线程将在主应用程序启动时运行,可以从中运行/加载。在程序的关闭操作上创建一个 java 事件侦听器,并在其中注册您的新线程。每当您的程序关闭时,这个新线程将启动其他线程来激活并最终节省资源以执行上述条件之一。您的新进程现在将一个接一个地杀死这些线程(只要每个都完成了工作),直到满足上述所有条件(标志)。当没有其他线程剩下时,这个新线程会杀死自己,程序结束。

于 2012-04-25T14:34:30.057 回答