第一步是将每个子进程完成的工作表示为
Future,如下所示:
final ProcessBuilder builder = ...;
// for each process you're going to launch
FutureTask task = new FutureTask(new Callable() {
@Override public Integer call() {
return builder.start().waitFor();
}
};
现在将所有任务提交给执行者:
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();
ExecutorCompletionService service = new ExecutorCompletionService(executor);
while (!executor.isTerminated()) {
Future finishedFuture = service.take();
System.out.println("Finishing process returned " + finishedFuture.get());
}
这个循环将在每个完成任务完成时迭代一次. returnValue将是子进程的退出代码.
现在,您还不确切知道哪个流程已完成.你可以改变Callable而不是返回一个Integer来返回Process,或者更好的是你自己的一个类来表示进程的输出.
哦,当然如果你不关心等待所有的任务,你可以只调用一次take().