java - java 8 中的并行流与 Completablefuture

标签 java java-8 completable-future

有什么区别:

List<String> parra = list.parallelStream()
    .map(heavyPrcessingFunction)
    .collect(Collectors.toList());

还有这个(除了第二个有点复杂):

List<CompletableFuture<Void>> com = list.stream()
    .map(x-> CompletableFuture.runAsync(() -> heavyPrcessingFunction.apply(x)))
    .collect(Collectors.toList());

CompletableFuture.allOf(com.toArray(new CompletableFuture[0])).join();
// get all of strings from com now

最佳答案

在语义上它们非常相似,主要是开销问题。

对于第二种方法,您必须为列表中的每个条目创建一个 CF,并将它们单独提交给通用 FJP。

另一方面,并​​行流可以通过将输入列表分块为几个大片来实现,仅将这些片作为任务提交到公共(public)池,然后让线程本质上循环该片,而不必拾取并从其工作队列中逐个 future 地解开 future 。 此外,流实现意味着不仅映射操作而且收集步骤都知道并行执行,因此可以对其进行优化。

更少的分配,更少的并发数据结构上昂贵的操作,更简单的代码。

关于java - java 8 中的并行流与 Completablefuture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57832584/

相关文章:

java - Camel 在完成时停止上下文

java - 获取JTable 焦点的问题?

java - 将 JSONArray 的内容映射到给定类的 Java 函数?

java - IntelliJ 在流中看到对象而不是正确的类类型

java - 如何为 CompletableFuture::supplyAsync 选择执行器

java-8 - Java 8 Completable Futures 所有不同的数据类型

java - 解析 2.000,00 到 2000 和 2.000,15 到 2000.15

java - 为什么我这里不能成功调用.put方法?

Java 8 - 将 LocalDate 转换为 ZonedDateTime

java - 如何在 Vertx 事件循环线程上运行 CompletableFuture 处理程序?