并行流和CompletableFuture的区别

14
在《Java 8实战》(作者:Urma、Fusco和Mycroft)一书中,他们强调并行流内部使用公共的fork join池,虽然可以全局配置,例如使用System.setProperty(...),但不可能为单个并行流指定值。
我后来看到了一个解决方法,其中涉及将并行流运行在自定义的ForkJoinPool中。
在该书的后面,他们有一个完整的章节专门介绍CompletableFuture。在此期间,他们进行了一个案例研究,比较了使用parallelStream与CompletableFuture各自的性能。结果发现它们的性能非常相似,原因是它们默认都使用相同的公共池(因此具有相同数量的线程)。
他们继续展示了一种解决方案,并认为在这种情况下,CompletableFuture更好,因为它可以配置为使用自定义Executor,其线程池大小由用户选择。当他们更新解决方案以利用此功能时,性能显著提高。
这让我想到,如果使用上述解决方法来处理并行流版本,是否可以获得类似的性能优势,从而使得这两种方法在性能方面变得相似?在这种情况下,为什么开发人员会选择CompletableFuture而不是并行流,明显CompletableFuture需要更多的工作量。
1个回答

17

在这种情况下,为什么要选择CompletableFuture而不是并行流,尽管它明显需要更多的开发工作。

依我之见,这取决于您想支持的接口。 如果您想支持异步API,例如

CompletableFuture<String> downloadHttp(URL url);

在这种情况下,只有可完成的 CompletableFuture 是有意义的,因为您可能希望在等待数据返回期间执行与此无关的其他操作。

另一方面,parallelStream() 最适合 CPU 绑定任务,其中您希望每个任务执行某些工作的一部分。即每个线程都在使用不同的数据执行相同的操作。正如您所提到的,它也更易于使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接