为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ibeautiful 2021-09-26 14:29:44
概念上非常简单。我们有一个巨大的遗留 Java 站点,它不使用线程/异步。登录需要很长时间,因为它对不同的微服务进行了十几次调用,但每次都是同步调用:在进行下一次调用之前,每个都等待另一个完成。但是,没有一个 API 调用依赖于任何其他调用的结果。但是在我们继续之前,我们确实需要获得所有结果并将它们组合起来。很明显,我们应该能够并行进行这十几个调用,但要等待它们全部完成以在下一步中使用它们的数据。所以在调用之前和之后一切都是同步的。然而,最好并行地、异步地——或者只是并行地——将它们各自发送出去——那么我们只受到单个最慢调用的限制,而不是所有调用的总连续时间。我读到 Java 8 在CompletableFuture. 但我还没有找到任何地方解释我的用途。我们不希望结果成为一个承诺 - 我们很高兴等到它们全部完成然后继续。JS 有Promise.all(),但即使如此也会返回一个承诺。我能想到的就是在异步调用完成后稍作等待,只有在我们获得所有结果后才继续。这显然是疯了。我在这里错过了什么吗?因为这对我来说似乎很明显,但似乎没有其他人对此有疑问——或者方法很简单,没有人费心去问,而我就是不明白。
查看完整描述

1 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

如果我理解正确,你想要这样的东西:


ExecutorService executorService = Executors.newFixedThreadPool(4); // TODO: proper number of threads


Future<Integer> future1 = executorService.submit(() -> callService1()); // TODO: proper type and method

Future<String> future2 = executorService.submit(() -> callService2()); // TODO: proper type and method


executorService.shutdown();

executorService.awaitTermination(5, TimeUnit.MINUTES); // TODO: proper timeout


Integer result1 = future1.get(); // TODO: proper type

String result2 = future2.get(); // TODO: proper type

解释:


查看完整回答
反对 回复 2021-09-26
  • 1 回答
  • 0 关注
  • 835 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信