gpt4 book ai didi

Java,等待子进程退出

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:34:31 24 4
gpt4 key购买 nike

使用 Java 的 ProcessBuilder 我正在创建一组子进程。我可以使用来自生成的 Process 对象的 waitFor() 方法来等待那个特定的子进程退出。

是否有可能以 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();
}
};

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

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类:

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

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

现在,您无法确切知道哪个进程已完成。您可以将 Callable 更改为而不是返回 Integer 以仅返回 Process 或更好的是您自己的表示流程输出的类。

哦,当然,如果您不关心等待所有任务,您可以只调用一次 take()

关于Java,等待子进程退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4622690/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com