Java并行流使用与否

Java并行流使用与否,java,parallel-processing,java-stream,Java,Parallel Processing,Java Stream,在Java中使用executor服务的并行流检查被认为是一种不好的做法吗?为什么? 正如您所知,myList.parallelStream().map(e->…)将在引擎盖下使用ForkJoinPool.common()。因此,如果您同时使用至少两个并行流,您可能会遇到以下问题: map功能被阻塞。但作为一种营救,这是有必要的 map函数可能非常占用CPU,这将导致其他并行流耗尽。有没有办法在RecursiveTasks之间或ForkJoinPools之间设置优先级 另一方面,您可以创建任意数量

在Java中使用executor服务的并行流检查被认为是一种不好的做法吗?为什么?

正如您所知,
myList.parallelStream().map(e->…)
将在引擎盖下使用
ForkJoinPool.common()
。因此,如果您同时使用至少两个并行流,您可能会遇到以下问题:

  • map
    功能被阻塞。但作为一种营救,这是有必要的
  • map
    函数可能非常占用CPU,这将导致其他并行流耗尽。有没有办法在
    RecursiveTask
    s之间或
    ForkJoinPool
    s之间设置优先级
  • 另一方面,您可以创建任意数量的
    ForkJoinPool
    s
    new ForkJoinPool(4)。提交(()->myList.parallelStream()…
    。在一个JVM上使用多个
    ForkJoinPool
    s是否被认为是性能明智的

    更新
    使用或不使用并行流=使用或不使用ForkJoinPool,对吗?我发现和链接对于回答最后一个问题非常有用。对于
    .parallel()
    .Joschua Bloch说:

    […]甚至不要尝试并行化流管道,除非 有充分的理由相信它将保持计算的正确性 并提高其速度。不适当地并行一个流的代价可能是巨大的 程序失败或性能灾难。如果您认为并行性可能 合理,确保代码在并行运行时保持正确,并且要小心 在实际条件下的性能度量。如果您的代码仍然正确 这些实验证明了你对性能提高的怀疑,然后 然后才并行化生产代码中的流

    -有效Java第3版,第225页,第28项:使流并行时要小心

    他建议您在实际情况下进行彻底的基准测试,并根据具体情况做出决定。此外,使用
    .parallel()
    不仅会导致性能不佳,还会导致安全故障:

    安全故障可能是由于并联使用 映射器、过滤器和其他程序员提供的无法遵循的函数对象 符合他们的规格

    -有效Java第3版,第224页,第28项:使流并行时要小心


    回答你的问题,这不是一个不好的练习,但是在使用<代码>并行()/代码>时,你应该尽最大的小心,不要盲目地在你的代码库中的每一个流上打它。

    这是一个非常有趣的谈话,在“何时考虑使用并行流”的问题上有一些智慧?,由布赖恩·戈茨本人分享。 他将接手本次研讨会的第二部分:

    Brian Goetz是Oracle的Java语言架构师,也是 JSR-335(Java语言的Lambda表达式)规范负责人 他是畅销书Java的作者 实践中的并发性,以及超过75篇关于Java的文章 从吉米·卡特开始,他就对编程着迷 他是总统


    是的,可能是重复的,但是除了这些陈述之外,还有什么原因呢?这些建议非常通用,就像没有人知道如何更好一样,让我们每次都进行基准测试。此外,我的问题是关于并行流与执行者服务