Java,等待子进程退出

Mik*_*ike 3 java child-process

使用Java ProcessBuilder我正在创建一组子进程.我可以使用waitFor()结果Process对象中的方法等待该特定子进程退出.

是否可以阻止任何子进程,以UNIX wait()系统调用的方式?

sjr*_*sjr 9

第一步是将每个子进程完成的工作表示为Future,如下所示:

final ProcessBuilder builder = ...;

// for each process you're going to launch
FutureTask task = new FutureTask(new Callable<Integer>() {
  @Override public Integer call() {
    return builder.start().waitFor();
  }
};
Run Code Online (Sandbox Code Playgroud)

现在将所有任务提交给执行者:

ExecutorService executor = Executors.newCachedThreadPool();
for (FutureTask task : tasks) {
  executor.submit(task);
}

// no more tasks are going to be submitted, this will let the executor clean up its threads
executor.shutdown();
Run Code Online (Sandbox Code Playgroud)

现在使用优秀的ExecutorCompletionService类:

ExecutorCompletionService service = new ExecutorCompletionService(executor);
while (!executor.isTerminated()) {
  Future<Integer> finishedFuture = service.take();
  System.out.println("Finishing process returned " + finishedFuture.get());
}
Run Code Online (Sandbox Code Playgroud)

这个循环将在每个完成任务完成时迭代一次.这returnValue将是子进程的退出代码.

现在,您还不确切知道哪个流程已完成.你可以改变Callable而不是返回一个Integer来返回Process,或者更好的是你自己的一个类来表示进程的输出.

哦,当然如果你不关心等待所有任务,你可以打电话take()一次.