当前位置: 首页 > 知识库问答 >
问题:

CompletableFuture在超时后返回所有完成的结果

李光华
2023-03-14

我想有一个清单的comletablefutures我想等待。带有以下代码。

  public static <T> CompletableFuture<List<T>> finishAllQuery(
  List<CompletableFuture<T>> futures) {
CompletableFuture<Void> allDoneFuture =
    CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]));
return allDoneFuture.thenApply(
    v -> futures.stream().filter(Objects::nonNull)
        .map(future -> future.join())
        .collect(Collectors.toList())
);
  }
CompletableFuture<List<Result>> allResponse = finishAllQuery(futures);
allResponse.get(5, milliseconds)

问题是,在所有的期货,其中一些可以是缓慢的,我想在到期时间后,get方法返回与所有完成的结果。有办法做到这一点吗?

多谢.

共有1个答案

贺宜修
2023-03-14

如果您不一定希望所有期货都完成,那么您不应该使用allof()。您可以使用CompletionService,然后使用带有timeout的poll()方法。于是流将是:

  1. 将ExcecutorService包装在CompletionService中
  2. 向CompletionService提交N个任务。然后轮询有超时的单个任务。类似于:

elapsedTime=0;可用时间=5ms;completedFutures=列表();

while (elapsedTime < availableTime):
    remainingTime = availableTime - elapsedTime; 
    startTime = currentTime();
    completedFutures.add(CompletionService.poll(timeout=remainingTime));
    elapsedTime += (currentTime() - startTime)
 类似资料:
  • 我有一点奇怪的情况,似乎不允许这个挂钩适合任何广泛建立的CompletableFuture漏洞。 在评估返回布尔值的主要方法中,我希望允许对三个不同方法的调用异步完成。这三个方法中的每一个都可以返回TRUE或FALSE。 如果任何返回FALSE,我希望评估删除余数并简单地返回FALSE值。重点是,它可以是三个中的任何一个,不一定是第一个。 但最重要的是,我需要在实际返回TRUE之前等待所有三个返回

  • 问题内容: 如标题所示。我该怎么做呢? 我想在forEach循环遍历每个元素并完成一些异步处理后调用。 有可能使它像这样工作吗?当forEach的第二个参数是一个回调函数,该函数一旦经过所有迭代便会运行? 预期产量: 问题答案: 不能提供这种效果(如果可以的话),但是有几种方法可以实现您想要的效果: 使用一个简单的计数器 (由于@vanuan等),这种方法可确保在调用“完成”回调之前处理所有项目。

  • 我使用JavaFX中的时间线对进行倒计时: 我想在时间线结束后返回一个值: 下面是一个最小的、完整的、可验证的示例: 您可以看到它首先显示“countdown Finished”并向下倒数到0,而不是从倒计时开始并向下倒数到“countdown Finished”。

  • 我正在创建,比如说,15个Callable任务,并提交它们: 然后我收集15个MyResult对象: 问题是:我没有从get()方法获得所有15个MyResult对象,而是有时获得不到15个对象。有时12有时10有时甚至更少,有时全部15。 我的印象是,方法是一个阻塞调用,将等待所有15个线程返回各自的结果,但看起来我错过了其中的一些线程并继续前进。我做错了什么?我是否未正确收集结果/等待结果?当

  • 我正在尝试实现一个通用的REST客户端,如下所示。我有自己的模型将HTTP响应表示为response T。这里T是服务调用的返回类型,它可能只是T或Ts列表。下面的代码不编译,我需要帮助。 最终调用下面的方法,