如何使用Java的ProcessBuilder.start()暂停进程运行?

时间:2011-06-01 20:43:57

标签: java process exec processbuilder

好吧,所以我正在编写这个程序,基本上批量运行其他java程序(多次,变化参数,并行执行等)。

到目前为止,运行部件运行良好。使用ProcessBuilder的.start()方法(相当于我相信的Runtime.exec()),它创建了一个单独的java进程,然后关闭它。

问题是我希望能够在这些进程启动后暂停/停止这些进程。使用简单的线程通常很容易做到,但外部进程似乎没有任何内置的等待/休眠功能,至少从外部角度来看是这样。

我的问题是:有没有办法暂停java.lang.Process对象?如果没有,是否有人知道任何包含此功能的相关exec库?除非所有这些,将Process扩展为更可行的替代方案?

3 个答案:

答案 0 :(得分:3)

  

我的问题是:有没有办法暂停java.lang.Process对象?

正如您可能已经发现的那样,标准API中不支持此功能。例如,Process不提供suspend() / resume()方法。

  

如果没有,是否有人知道任何包含此功能的相关exec库?

在符合POSIX标准的操作系统(如GNU / Linux或Mac OS)上,您可以使用另一个系统调用(使用Runtime.execProcessBuilder或一些本机实现的库)来发出kill命令

使用kill命令,您可以发送SIGSTOP(暂停进程)和SIGCONT(恢复进程)等信号。

(你需要掌握外部程序的进程ID。周围有很多questionsanswers可以解答这个问题。)

答案 1 :(得分:2)

您需要创建一个系统,用于在进程之间发送消息。你可以这样做:

  1. 根据操作系统发送signals。 (正如aioobe所说。)
  2. 让一个进程偶尔检查另一个进程可以创建/删除的文件的存在/不存在。 (如果正在读/写文件,则需要使用文件锁定。)
  3. 让你的“主要”进程监听一个端口,当它启动子进程时,它会告诉他们(通过一个comamnd-line参数)如何在启动时“打电话回家”。两个程序在做工作和检查处理消息之间交替。
  4. 根据您的描述(复杂批处理环境中的所有Java程序),我建议#3,TCP / IP通信。

    虽然它肯定涉及额外的工作,但它也使您可以灵活地在不同的流程之间发送任何类型的命令或信息。

答案 2 :(得分:0)

进程表示在计算机上运行的单独进程。 Java肯定不允许你通过java.lang.Process暂停它们。您可以使用Process.destroy()强制停止它们。对于暂停,您需要合作生成的过程。

这些是什么过程?你写过它们吗?