gpt4 book ai didi

java - 如何等待超时的 ListenableFuture 列表

转载 作者:搜寻专家 更新时间:2023-10-31 20:25:04 27 4
gpt4 key购买 nike

我正在处理一个问题,我有一个 List<ListenableFuture<T>> .我想将所有这些 future 的结果汇总成一个 List<T>超时。天真的方法是这样的:

List<T> blockForResponses(List<ListenableFuture<T>> futures, long timeoutMillis) {
return futures.stream()
.map(future -> future.get(timeoutMillis,TimeUnit.MILLISECONDS)
.collect(Collectors.toList());
}

这不起作用,因为它等待每个 future 的超时,我希望它是整个列表的超时。手动跟踪已经过去了多少时间也不起作用,因为如果第一个超时,就没有时间尝试其他时间了。

我正在寻找的解决方案将对所有 future 强制执行超时,并在超时结束或列表中的所有 future 完成时返回。然后我可以自己检查列表中的每个 future 以汇总结果并检查哪些超时。

最佳答案

这个问题原来比我想象的要简单。我能够使用 Futures.allAsList 方法,然后捕获 TimeoutException:

List<T> blockForResponses(List<ListenableFuture<T>> futures, long timeoutMillis) {
ListenableFuture<List<T>> futureOfList = Futures.allAsList(futures);
List<T> responses;
try {
responses = futureOfList.get(timeoutMillis, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
responses = new ArrayList<>();
for (ListenableFuture<T> future : futures) {
if (future.isDone()) {
responses.add(Uninterruptibles.getUninterruptibly(future));
}
}
}
return responses;
}

关于java - 如何等待超时的 ListenableFuture 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53876451/

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