环境:Windows 7
我正在使用 ProcessBuilder
启动外部流程。可以使用定义要使用多少个 CPU 核心的参数来调用该外部程序。然后它启动尽可能多的进程来执行计算。
问题似乎是初始调用的进程立即终止。所以process.waitFor()
实际上并不等待计算完成。
我怎样才能让它等待它产生的子进程?或者我怎样才能等到特定名称的所有进程都被终止?
根据评论进行编辑:
ProcessBuilder pb = new ProcessBuilder("myExe", "-i", inputFile, "-o", outputFile, "-np", "4");
pb.directory(new File(tempPath));
Process myProcess = pb.start();
myProcess.waitFor();
进程是第 3 方 exe 文件(无 GUI)。
编辑2可能的解决方法(有另一个问题):
作为解决方法,我尝试了通过谷歌找到的解决方案:
while(wait) {
Process p = Runtime.getRuntime().exec(System.getenv("windir") +"\\system32\\"+"tasklist.exe /fi \"imagename eq myExe.exe\"");
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream(), "US-ASCII"));
while ((line = input.readLine()) != null) {
if (line.startsWith("INFO: No tasks are running")) {
wait = false;
}
}
if (wait) {
Thread.sleep(2000);
}
input.close();
}
这应该返回具有给定名称的所有进程的列表。问题是从 Java 调用时列表始终为空,但从 cli 手动调用时可以正常工作。有什么想法吗?
最佳答案
类似Java的脏解决方案
目前java.lang.Process还很差,并且正在变得丰富。 例如,here您可以找到功能请求。在java 8中, 你已经有了像 isAlive 和 destroyForcously 这样的方法 您可以尝试类似以下肮脏的解决方案:
- Get the id of the main process通过反射(reflection)。
- Get the child processes - 特定于 Windows
- Wait for the found child processes
第 2 步和第 3 步可以作为一个脚本实现并执行为 java.lang.Process.waitFor
使用可执行文件
我认为可执行文件是某种 MPI 程序。如果您有权访问源代码,我最好将其更改为正常工作并等待所有线程。
关于Java:WAITING所有子进程完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33603622/