使用 Java 8 和 lambda 可以很容易地像流一样遍历集合,使用并行流也同样容易。 文档 中的两个示例,第二个示例使用 parallelStream:
myShapesCollection.stream()
.filter(e -> e.getColor() == Color.RED)
.forEach(e -> System.out.println(e.getName()));
myShapesCollection.parallelStream() // <-- This one uses parallel
.filter(e -> e.getColor() == Color.RED)
.forEach(e -> System.out.println(e.getName()));
只要我不关心顺序,使用并行总是有益的吗?人们会认为将工作分配到更多核心上会更快。
还有其他的考虑吗?什么时候应该使用并行流,什么时候应该使用非并行?
(问这个问题是为了引发关于如何以及何时使用并行流的讨论,而不是因为我认为总是使用它们是个好主意。)
原文由 Matsemann 发布,翻译遵循 CC BY-SA 4.0 许可协议
与顺序流相比,并行流的开销要高得多。协调线程需要花费大量时间。我会默认使用顺序流,只有在以下情况下才考虑并行流
我有大量的项目要处理(或者每个项目的处理都需要时间并且是可并行的)
我首先遇到了性能问题
我还没有在多线程环境中运行该进程(例如:在 Web 容器中,如果我已经有许多请求要并行处理,则在每个请求中添加额外的并行层可能产生的负面影响大于正面影响)
在您的示例中,性能无论如何都将由对
System.out.println()
的同步访问驱动,并且使该过程并行将没有效果,甚至是负面效果。此外,请记住并行流并不能神奇地解决所有同步问题。如果进程中使用的谓词和函数使用共享资源,则必须确保一切都是线程安全的。特别是,副作用是您并行进行时真正需要担心的事情。
无论如何,测量,不要猜测!只有测量才能告诉您并行性是否值得。