如何在 Java 8 中进行并行调用

How to make parallel call in Java 8

如何在 Java 8 中进行并行调用?

我需要通过要更新的补丁发送数据来调用端点。由于数据太多,我不想对每个数据都执行 forEach(),但我想并行执行,只有在所有并行调用都已应答时才继续该过程。 你能帮帮我吗?

您可以使用 CompletableFuture API 来完成。考虑下一个例子

// the initial data
ArrayList<String> data = ...;

// submit a call for each element separately
CompletableFuture[] futures = data.stream()
         .map(datum -> CompletableFuture.supplyAsync(() -> {
              // do call
          }))
          .toArray(CompletableFuture[]::new);

// wait for all the calls to finish
CompletableFuture.allOf(futures);

Future是一个抽象,是异步计算的结果。它可以完成并产生结果,也可以正在处理中。 allOf 方法等待所有创建的期货完成。

在上面的示例中,每个调用都将在线程池的单独线程中进行(默认为 ForkJoinPool)。但是,如果数据集中的元素数量足够大,我建议拆分成多个组,并在一个组内顺序处理请求。

假设您有 16 个工作线程,因此有 16 个组。元素个数为100。你必须将这100个元素分布到这16个worker中,并在每个worker中按顺序处理它们。

如果是HTTP调用,也可以考虑异步HTTP客户端