环境:Windows 7Java:等待所有子进程完成
我正在启动一个外部进程ProcessBuilder
。这个外部程序可以用定义要使用多少个CPU核的参数来调用。然后启动尽可能多的进程来执行计算。
这个问题似乎是,初始调用的进程然后立即终止。所以process.waitFor()
实际上并没有等待计算完成。
我怎样才能让它等待子弹过程呢?或者我该如何等待,直到特定名称的所有进程都被终止了?
EDIT由于评论:
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)。
EDIT 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时正常工作。任何想法为什么?
你能告诉我们你用于创建过程和等待它的代码吗? – Hulk
也可能相关:您创建什么样的过程?作为[Process]的JavaDocs(https://docs.oracle.com/javase/8/docs/api/java/lang/Process。html)指出:'创建进程的方法可能不适用于某些本机平台上的特殊进程,例如本机窗口进程,守护进程,Microsoft Windows上的Win16/DOS进程或shell脚本。' – Hulk
您的子进程是否处理' myExe'产生更多的子进程? –