Java:WAITING所有子进程完成

标签 java process multiprocessing wait

环境: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还很差,并且正在变得丰富。 例如,here您可以找到功能请求。在java 8中, 你已经有了像 isAlivedestroyForcously 这样的方法 您可以尝试类似以下肮脏的解决方案:

    1. Get the id of the main process通过反射(reflection)。
    2. Get the child processes - 特定于 Windows
    3. Wait for the found child processes

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

  • 使用可执行文件

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

关于Java:WAITING所有子进程完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33603622/

相关文章:

java - 让ListVIew中的每个项目跳转到其他Activity

java - "java.lang.IllegalArgumentException: No view found for id 0x7f090057 for fragment"- Android fragment

java - 实现 Runnable 并扩展 Thread 类的线程名称

c# - 启动进程时重定向标准错误和标准输入时出现问题

c# - 如何在当前用户下启动进程?

Python 多处理 - 进程之间的管道通信

python - Slurm 多处理 Python 作业

java - 图标的 PropertyChange 监听器

python - 如果 RAM 接近饱和,如何终止 Python 进程(Windows 上的 Anaconda)?

python - 这个多处理 python 脚本出了什么问题?