在Java中使用并行流insdead执行器服务被视为不良做法?为什么?的
如您所知ForkJoinPool.common()
将使用map
。因此,如果您同时使用至少两个并行流,则可能会遇到以下问题:
map
功能正在阻止。但是有ForkJoinPool.ManagedBlocker作为救援。RecursiveTask
函数可能非常占用CPU,这会导致其他并行流挨饿。 有没有办法在ForkJoinPool
之间或ForkJoinPool
之间设置优先级? 另一方面,您可以根据需要创建尽可能多的new ForkJoinPool(4).submit(() -> myList.parallelStream()...
个。 ForkJoinPool
。 在一个JVM上使用多个matplotlib
是否被认为是性能方面的?
答案 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以来一直对编程着迷 是总统。