使用或不使用Java并行流

时间:2018-01-27 00:53:25

标签: java parallel-processing java-stream

在Java中使用并行流insdead执行器服务被视为不良做法?为什么?

如您所知ForkJoinPool.common()将使用map。因此,如果您同时使用至少两个并行流,则可能会遇到以下问题:

  1. map功能正在阻止。但是有ForkJoinPool.ManagedBlocker作为救援。
  2. RecursiveTask函数可能非常占用CPU,这会导致其他并行流挨饿。 有没有办法在ForkJoinPool之间或ForkJoinPool之间设置优先级?
  3. 另一方面,您可以根据需要创建尽可能多的new ForkJoinPool(4).submit(() -> myList.parallelStream()...个。 ForkJoinPool在一个JVM上使用多个matplotlib是否被认为是性能方面的?

    更新

    使用与否并行使用或不使用ForkJoinPool,对吧?我发现thisthis链接对于最后一个问题非常有用

2 个答案:

答案 0 :(得分:4)

.parallel()没有适合所有解决方案。 Joschua Bloch说:

  

[...]甚至不尝试并行化流管道,除非你   有充分的理由相信它会保持计算的正确性   并提高其速度。不恰当地并行化流的成本可以是a   程序失败或性能灾难。如果您认为可能存在并行性   合理的,确保你的代码在并行运行时保持正确,并且要小心   在现实条件下的性能测量。如果您的代码仍然正确   而这些实验证实了你对性能提升的怀疑   然后才在生产代码中并行化流。

     

- Effective Java 3rd Edition,第225页,第28项:使流并行时要小心

他建议你在现实条件下做一个彻底的基准,并根据具体情况决定。此外,不仅可以使用.parallel()导致性能不佳,还可能导致安全性失败:

  

使用管道并行化可能会导致安全故障   映射器,过滤器和其他程序员提供的无法遵守的功能对象   符合他们的规格。

     

- Effective Java 3rd Edition,第224页,第28项:使流并行时要小心

要回答你的问题,它不被认为是不好的做法,但在使用.parallel()时你应该非常谨慎,而不是盲目地在你的代码库中的每一个流上拍它。

答案 1 :(得分:1)

Brian Goetz本人也分享了一个非常有趣的演讲,它围绕“何时考虑使用并行流?”这个问题分享了一些智慧。 他将主持本次研讨会的第二部分: https://www.youtube.com/watch?v=2nup6Oizpcw&t=25m43s

  

Brian Goetz是Oracle的Java语言架构师,并且是   JSR-335(Java的Lambda表达式)的规范负责人   编程语言。)他是最畅销的Java的作者。   并发实践,以及有关Java的75篇以上文章   自Jimmy Carter以来一直对编程着迷   是总统。