Java 并行流与可完成未来的区别

Java 并行流与可完成未来的区别,java,multithreading,parallel-processing,java-stream,completable-future,Java,Multithreading,Parallel Processing,Java Stream,Completable Future,在《Java 8在运行》(由Urma、Fusco和Mycroft撰写)一书中,他们强调了并行流在内部使用公共fork-join池,虽然这可以全局配置,例如使用System.setProperty(…),但不可能为单个并行流指定值 此后,我看到了在定制的ForkJoinPool中运行并行流的方法 在本书的后面,他们有一整章专门讨论CompletableFuture,在这一章中,他们进行了一个案例研究,比较了使用并行流和CompletableFuture的各自性能。事实证明,它们的性能非常相似——它

在《Java 8在运行》(由Urma、Fusco和Mycroft撰写)一书中,他们强调了并行流在内部使用公共fork-join池,虽然这可以全局配置,例如使用System.setProperty(…),但不可能为单个并行流指定值

此后,我看到了在定制的ForkJoinPool中运行并行流的方法

在本书的后面,他们有一整章专门讨论CompletableFuture,在这一章中,他们进行了一个案例研究,比较了使用并行流和CompletableFuture的各自性能。事实证明,它们的性能非常相似——它们强调了这一点的原因,因为它们都默认使用相同的公共池(因此线程数量相同)

他们接着展示了一个解决方案,并认为CompletableFuture在这种情况下更好,因为可以使用自定义执行器,线程池大小由用户选择。当他们更新解决方案以利用此功能时,性能将显著提高

这让我想到——如果使用上面强调的解决方法对并行流版本执行相同的操作,那么性能优势会相似吗?因此,这两种方法在性能方面会再次相似吗?在这种情况下,当开发人员显然需要更多的工作时,为什么要选择CompletableFuture而不是并行流呢

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

IMHO这取决于您希望支持的接口。如果您希望支持异步API,例如

CompletableFuture<String> downloadHttp(URL url);
CompletableFuture下载http(URL);
在这种情况下,只有一个完整的未来才有意义,因为在等待数据下来时,您可能想做一些其他不相关的事情

另一方面,
parallelStream()
最适合于CPU受限的任务,您希望每个任务都执行部分工作。i、 每个线程用不同的数据做相同的事情。正如你所说,它也更容易使用