如何在Java8中进行并行调用

如何在Java8中进行并行调用,java,parallel-processing,patch,Java,Parallel Processing,Patch,如何在Java8中进行并行调用 我需要通过将要更新的补丁发送数据来调用端点。由于数据太多,我不想对每一个都执行forEach(),但我希望并行执行,并仅在所有并行调用都已应答时才继续此过程。 你能帮我吗?你可以使用CompletableFutureAPI来完成。考虑下一个例子 // the initial data ArrayList<String> data = ...; // submit a call for each element separately Completab

如何在Java8中进行并行调用

我需要通过将要更新的补丁发送数据来调用端点。由于数据太多,我不想对每一个都执行
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);
//初始数据
ArrayList数据=。。。;
//分别为每个元素提交调用
CompletableFuture[]futures=data.stream()
.map(基准->可完成的未来.supplyAsync(()->{
//打电话
}))
.toArray(可完成的未来[]::新);
//等待所有通话结束
可完成的未来。allOf(期货);
未来是一个抽象,它意味着异步计算的结果。它可以完成并产生结果,也可以正在处理
allOf
方法等待所有已创建的未来的完成

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

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


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

例如使用流式API与并行流()将是一种方式,有很多。我自己没有投反对票,但投反对票的人可能会用“缺乏对SO标准的研究”之类的话来证明这一点。除了支持并行处理的
流支持
框架之外,您还应该阅读Java中的并发性(使用线程)。有许多类是为支持并发而设计的。最好的方法之一可能是
ForkJoin