繁体   English   中英

Java:等待所有子进程完成

[英]Java: wait for all child process to finish

环境: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相当差并且正在变得更加丰富。 例如,您可以在此处找到功能请求。 在java 8中,你已经有像isAlivedestroyForcibly这样的方法所以你可以尝试类似下面的脏解决方案:

    1. 通过反射获取主进程的id
    2. 获取特定于Windows 的子进程
    3. 等待找到的子进程

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

  • 使用可执行文件

    我想,可执行文件是某种MPI程序。 如果您有权访问源代码,我最好将其更改为正常工作并等待所有线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM