加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java,等待子进程退出

发布时间:2020-12-15 08:37:32 所属栏目:Java 来源:网络整理
导读:使用 Java的ProcessBuilder我正在创建一组子进程.我可以使用生成的Process对象中的waitFor()方法等待该特定子进程退出. 是否可以阻止任何子进程,以UNIX wait()系统调用的方式? 解决方法 第一步是将每个子进程完成的工作表示为 Future,如下所示: final Proc
使用 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().

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读