代码之家  ›  专栏  ›  技术社区  ›  ChrisNY

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

  •  5
  • ChrisNY  · 技术社区  · 7 年前

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

    我听说Java8有一套非常棒的新操作 CompletableFuture . 但我还没有找到我的用途解释。我们不希望结果是一个承诺-我们很高兴等到他们全部完成,然后继续。JS有 Promise.all() ,但即使这样也会回报一个承诺。

    我所能想到的就是在异步调用完成后稍微等待一下,并且只有在得到所有结果后才能继续。显然是疯了。

    我是不是漏了什么?因为这对我来说太明显了,但似乎没有其他人对此有问题,或者说方法太简单了,没人愿意问,我就是不明白。

    1 回复  |  直到 7 年前
        1
  •  6
  •   Tomasz Linkowski    7 年前

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

    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