如何在 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客户端
如何在 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客户端