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

标签 java guava future

我正在处理一个问题,我有一个 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/

相关文章:

java - 在 Java 中按管道拆分会产生不同的结果

java - 使用 Google Guava 格式化字符串

java - 用于字符串处理的 Akka 分散-聚集

java - 迭代集合时检查可为空性

java - 使用 Guava 10 的谓词和函数接口(interface)与 GWT 2.4.0

c++ - 为什么我应该使用 std::async?

sockets - boost async_accept无法与boost asio use_future选项一起使用

scala - 忽略 future 的理解失败

java - 简单: Adding index to a Java array

java - 导入成功后Facebook SDK导入报错