环境: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可能的解决方法(还有另一个问题):
作为一种解决方法,我尝试使用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手动调用时,该列表正常工作。有什么想法吗?
答案 0 :(得分:0)
类似Java的肮脏解决方案
目前 java.lang.Process 相当差并且正在变得更加丰富。 例如,here您可以找到功能请求。在java 8中, 你已经有像 isAlive 和 destroyForcibly 这样的方法 你可以尝试类似下面的脏解决方案:
步骤2和3可以作为一个脚本实现并执行为 java.lang.Process.waitFor
使用可执行文件
我想,可执行文件是某种MPI程序。如果您有权访问这些来源,我最好将其更改为正常工作并等待所有线程。