并行流和CompletableFuture之间的差异

时间:2016-01-22 11:11:33

标签: java multithreading parallel-processing java-stream completable-future

在“Java 8 in action”(Urma,Fusco和Mycroft)一书中,他们强调并行流在内部使用公共fork连接池,虽然这可以全局配置,例如:使用System.setProperty(...),它不可能为单个并行流指定值。

我已经看到workaround涉及在自定义ForkJoinPool中运行并行流。

在本书的后面,他们有一整章致力于CompletableFuture,在此期间他们有一个案例研究,他们比较使用parallelStream VS和CompletableFuture的各自表现。事实证明他们的表现非常相似 - 他们强调了这一点的原因是他们都是默认使用相同的公共池(因此相同数量的线程)。

他们继续展示解决方案并争辩说CompletableFuture在这种情况下更好,因为它可以被设置为使用自定义Executor,用户选择的线程池大小。当他们更新解决方案以利用它时,性能会得到显着提升。

这让我想到 - 如果使用上面突出显示的解决方法对并行流版本做同样的事情,性能优势是否会相似,那么这两种方法在性能方面是否会再次相似?在这种情况下,为什么人们会选择CompletableFuture而不是并行流,因为它明显需要开发人员的更多工作。

1 个答案:

答案 0 :(得分:7)

  

在这种情况下,为什么人们会选择CompletableFuture而不是并行流,因为它显然需要开发人员的更多工作。

恕我直言这取决于您希望支持的界面。如果您希望支持异步API,例如

CompletableFuture<String> downloadHttp(URL url);

在这种情况下,只有可完成的未来才有意义,因为在等待数据停止时,您可能想要做其他不相关的事情。

另一方面,parallelStream()最适合CPU绑定任务,您希望每个任务执行某些工作的一部分。即每个线程使用不同的数据做同样的事情。你的意思是它也更容易使用。

相关问题