在 Java 中如何等待所有异步调用完成?

概念上非常简单。我们有一个巨大的遗留 Java 站点,它不使用线程/异步。登录需要很长时间,因为它对不同的微服务进行了十几次调用,但每次都是同步调用:在进行下一次调用之前,每个都等待另一个完成。但是,没有一个 API 调用依赖于任何其他调用的结果。

但是在我们继续之前,我们确实需要获得所有结果并将它们组合起来。很明显,我们应该能够并行进行这十几个调用,但要等待它们全部完成以在下一步中使用它们的数据。

所以在调用之前和之后一切都是同步的。然而,最好并行地、异步地——或者只是并行地——将它们各自发送出去——那么我们只受到单个最慢调用的限制,而不是所有调用的总连续时间。

我读到 Java 8 在CompletableFuture. 但我还没有找到任何地方解释我的用途。我们不希望结果成为一个承诺 - 我们很高兴等到它们全部完成然后继续。JS 有Promise.all(),但即使如此也会返回一个承诺。

我能想到的就是在异步调用完成后稍作等待,只有在我们获得所有结果后才继续。这显然是疯了。

我在这里错过了什么吗?因为这对我来说似乎很明显,但似乎没有其他人对此有疑问——或者方法很简单,没有人费心去问,而我就是不明白。


ibeautiful
浏览 836回答 1
1回答

智慧大石

如果我理解正确,你想要这样的东西:ExecutorService executorService = Executors.newFixedThreadPool(4); // TODO: proper number of threadsFuture<Integer> future1 = executorService.submit(() -> callService1()); // TODO: proper type and methodFuture<String> future2 = executorService.submit(() -> callService2()); // TODO: proper type and methodexecutorService.shutdown();executorService.awaitTermination(5, TimeUnit.MINUTES); // TODO: proper timeoutInteger result1 = future1.get(); // TODO: proper typeString result2 = future2.get(); // TODO: proper type解释:上面的代码创建了一个ExecutorService有 4 个线程的线程,您可以向其中提交所有任务(即调用微服务)然后你打电话ExecutorService.shutdown(不允许更多的任务提交)和ExecutorService.awaitTermination(等到所有任务完成)最后,你调用Future.get所有的期货来得到结果请注意,如果任务在执行过程中抛出异常,则调用Future.get将抛出一个ExecutionException包装任务抛出的异常
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python