Mik*_*ike 3 java child-process
使用Java ProcessBuilder我正在创建一组子进程.我可以使用waitFor()结果Process对象中的方法等待该特定子进程退出.
是否可以阻止任何子进程,以UNIX wait()系统调用的方式?
第一步是将每个子进程完成的工作表示为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()一次.