2

好的,所以我正在编写这个程序,它基本上为我批量运行其他 java 程序(多次、不同的参数、并行执行等)。

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

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

我的问题是:有没有办法暂停 java.lang.Process 对象?如果没有,是否有人知道任何包含此功能的相关 exec 库?排除所有这些,扩展 Process 是一个更可行的选择吗?

4

3 回答 3

3

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

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

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

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

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

(您将需要获取外部程序的进程 ID。有很多问题答案可以回答这个问题。)

于 2011-06-01T20:50:11.997 回答
2

您将需要创建一个用于在进程之间发送消息的系统。您可以通过以下方式做到这一点:

  1. 发送信号,取决于操作系统。(如 aioobe 笔记。)
  2. 让一个进程偶尔检查另一个进程可以创建/删除的文件是否存在。(如果正在读取/写入文件,则需要使用文件锁定。)
  3. 让您的“主”进程在端口上侦听,并在启动子进程时告诉他们(通过命令行参数)如何在启动时“打电话回家”。这两个程序在工作和检查处理消息之间交替。

根据您所描述的(复杂批处理环境中的所有 Java 程序),我建议 #3,TCP/IP 通信。

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

于 2011-06-01T20:57:16.407 回答
0

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

这些是什么类型的过程?你写的吗?

于 2011-06-01T20:49:41.290 回答