gpt4 book ai didi

java - 等待一批 future 完成时超时?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:23:07 26 4
gpt4 key购买 nike

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

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

现在我想让所有 future 最多等待 n 秒,直到全部完成。我知道我可以调用 Future#get(timeout) 但是如果我在一个循环中为我的所有 futures 依次调用它,超时就会开始累加。伪代码:

for all futures
future.get(timeout)

get block 在结果准备好之前超时。因此,如果第一个在超时前完成,第二个也在超时前完成,依此类推,整个执行时间最多为 number of futures * timeout 而不是 timeout

因此,我正在寻找一种方法,该方法接受 Future 列表和超时,并行运行所有内容,然后返回 future 结果的集合。有什么想法吗?

最佳答案

您可以使用 ExecutorService.invokeAll :

Executes the given tasks, returning a list of Futures holding their status and results when all complete or the timeout expires, whichever happens first. Future.isDone() is true for each element of the returned list. Upon return, tasks that have not completed are cancelled. Note that a completed task could have terminated either normally or by throwing an exception. The results of this method are undefined if the given collection is modified while this operation is in progress.


如果您已经有需要监控的Future并且不能使用invokeAll,您可以简单地自己测量超时。伪代码:

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

通过这种方式,您最多可以为每个 future 提供剩余的持续时间,直到达到超时为止。

关于java - 等待一批 future 完成时超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17434311/

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