有什么区别:
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/