【问题标题】:Difference between parallel stream and CompletableFuture并行流和 CompletableFuture 的区别
【发布时间】:2016-01-22 11:11:32
【问题描述】:

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

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

在本书的后面,他们有一整章专门介绍 CompletableFuture,在此期间他们有一个案例研究,比较了使用 parallelStream 与 CompletableFuture 各自的性能。事实证明它们的性能非常相似 - 他们强调这样做的原因是它们都默认使用相同的公共池(因此线程数量相同)。

他们继续展示了一个解决方案,并认为 CompletableFuture 在这种情况下更好,因为它可以配置为使用自定义 Executor,线程池大小由用户选择。当他们更新解决方案以利用这一点时,性能会显着提高。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    CompletableFuture<String> downloadHttp(URL url);
    

    在这种情况下,只有可完成的未来才有意义,因为您可能希望在等待数据下来的同时做一些不相关的事情。

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

    【讨论】:

      猜你喜欢
      • 2022-08-20
      • 1970-01-01
      • 2016-05-21
      • 2015-10-24
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 2016-12-18
      相关资源
      最近更新 更多