【问题标题】:How to make parallel call in Java 8如何在 Java 8 中进行并行调用
【发布时间】:2019-11-30 19:15:42
【问题描述】:

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

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

【问题讨论】:

  • 例如使用带有 parallelStream() 的流 api 将是一种方法,有许多 possibilities。我自己没有投反对票,但投反对票的人可能会以“缺乏对 SO 标准的研究”左右来证明这一点。
  • 除了支持并行处理的stream support 框架之外,您还应该阅读Java 中的并发性(使用线程)。有许多类旨在支持并发。可能最好的之一是ForkJoin

标签: java parallel-processing patch


【解决方案1】:

您可以使用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 个工作人员,并在每个工作人员内部按顺序处理它们。

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

【讨论】:

  • 为了使我的代码基于上述示例工作,我添加了 .join(): CompletableFuture.allOf().join()
猜你喜欢
  • 2021-02-04
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多