首页 文章

等待一批期货完成时超时?

提问于
浏览
6

我有一组 Futures 通过将 Callable 提交给 Executor 而创建 . 伪代码:

for all tasks
  futures.add(executor.submit(new callable(task)))

现在我想让所有期货等待最多n秒,直到全部完成 . 我知道我可以打电话给 Future#get(timeout) ,但是如果我在循环中按顺序调用我的所有未来,则时间开始加起来 . 伪代码:

for all futures
  future.get(timeout)

get 块超时,直到结果准备好 . 因此,如果第一个在超时之前完成,第二个也在超时之前完成,那么整个执行时间最多为 number of futures * timeout 而不是 timeout .

因此,我正在寻找一个接受 Future 列表和超时的方法,并行运行,然后返回未来结果的集合 . 有任何想法吗?

1 回答

  • 6

    你可以使用ExecutorService.invokeAll

    执行给定的任务,返回一个Futures列表,其中包含所有完成或超时到期时的状态和结果,以先发生者为准 . Future.isDone()对于返回列表的每个元素都为true . 返回后,未完成的任务将被取消 . 请注意,已完成的任务可能正常终止或通过抛出异常终止 . 如果在此操作正在进行时修改了给定集合,则此方法的结果未定义 .


    如果您已经需要监视 Future 并且无法使用 invokeAll ,则可以自行测量超时 . 伪代码:

    long endTime = System.currentTimeMillis() + timeoutMS;
    for(f : futures)
        f.get(Math.max(0, endTime - System.currentTimeMillis()), TimeUnit.MILLISECONDS);
    

    这样,您最多可以为每个未来提供剩余的持续时间,直到达到超时 .

相关问题