环境: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();
进程是一个没有 GUI 的第三方可执行文件。
编辑 2:可能的解决方法(但还有另一个问题):
作为一种解决方法,我尝试了在 Google 上找到的一个解决方案:
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中调用时,它可以正常工作。有什么想法为什么会出现这种情况?
myExe
会产生更多的子进程吗? - Little Bobby TablesmyExe
是等待其子进程终止还是异步生成它们?Java代码等待的进程是否可能在其子进程之前终止? - Little Bobby Tables