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