Java Spring异步任务返回未来

Java Spring异步任务返回未来,java,spring,spring-boot,Java,Spring,Spring Boot,我正在开发一个调用多个相互独立的外部服务的服务。我整理了所有这些服务的回复,并将其作为综合回复返回。因为这些不是相互依赖的,所以我使用Spring的@Async功能并行执行所有这些活动。我将遵循此链接中提供的示例 这里,使用while循环等待,直到获得所有响应- while (!(page1.isDone() && page2.isDone() && page3.isDone())) { Thread.sleep(10); //10-mi

我正在开发一个调用多个相互独立的外部服务的服务。我整理了所有这些服务的回复,并将其作为综合回复返回。因为这些不是相互依赖的,所以我使用Spring的@Async功能并行执行所有这些活动。我将遵循此链接中提供的示例

这里,使用while循环等待,直到获得所有响应-

    while (!(page1.isDone() && page2.isDone() && page3.isDone())) {
        Thread.sleep(10); //10-millisecond pause between each check
    }

我知道这是一个示例代码,旨在解释这个概念,它确实有效。然而,在企业应用程序中,可以使用类似于上面所示的while循环,还是应该采用不同的方法?如果必须采用不同的方法,那么与使用while循环相比,该方法的优势是什么?

您不能只使用Future.get()?这是一个阻塞呼叫。一定要等到结果出来。您可以执行以下操作:

List<Future<?>> results = Lists.newArrayList();
results.add(page1.get());
results.add(page2.get());
results.add(page3.get());

ListTry CompletionService:谢谢,这可以与Spring的@Async结合使用吗?谢谢,这非常有用。我不认为CompletionService是这个场景的最佳选择——因为它的目的是“尽快获得第一次返回的结果”。在这个问题的场景中,他需要“等待所有线程返回,然后决定要做什么”。所以我认为ExecutorService.invokeAll()这是最好的选择。我可能是对的吗?谢谢Christopher,这确实回答了我最初的问题。但是当我看到你提供的链接时,我发现CompletionService是一个更好的选择,因为我可以更好地处理返回错误的场景。如果我的理解不正确,请告诉我。CompletionService绝对是更好的ap但是如果异步调用没有那么昂贵,失败率也会很低,我觉得一个接一个地等待结果没有什么错。非常感谢,克里斯!