2015-11-09 126 views
2

环境: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时正常工作。任何想法为什么?

+0

你能告诉我们你用于创建过程和等待它的代码吗? – Hulk

+0

也可能相关:您创建什么样的过程?作为[Process]的JavaDocs(https://docs.oracle.com/javase/8/docs/api/java/lang/Process。html)指出:'创建进程的方法可能不适用于某些本机平台上的特殊进程,例如本机窗口进程,守护进程,Microsoft Windows上的Win16/DOS进程或shell脚本。' – Hulk

+0

您的子进程是否处理' myExe'产生更多的子进程? –

回答

0
  • 类似Java的肮脏的解决方案

    目前java.lang.Process中比较差,并且越来越丰富。 例如,here您可以找到功能请求。在java中8, 你已经有一个像的IsAlive方法destroyForcibly所以 你可以尝试像下面这样肮脏的解决方案:

    1. Get the id of the main process反射。
    2. Get the child processes - 特定的Windows
    3. Wait for the found child processes

    步骤2和3可以实现为一个脚本,执行作为 java.lang.Process.waitFor

  • 与工作可执行文件

    我想,可执行文件是某种M PI程序。如果你有权访问源代码,我最好将它改为正确工作并等待所有线程。

+0

是的,你对MPI程序是正确的。但是修复超出了范围。 –