如果可能的话,我应该总是使用并行流吗?

如果可能的话,我应该总是使用并行流吗?

使用Java 8和lambda,可以很容易地将集合作为流来迭代,而且使用并行流也同样容易。两个例子医生,第二个使用并行流:

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()));

只要我不关心顺序,使用并行总是有益的吗?人们可能会认为,在更多的核心上划分工作会更快。

还有其他考虑吗?什么时候应该使用并行流,什么时候应该使用非平行流?

(这个问题被要求引发关于如何和何时使用并行流的讨论,而不是因为我认为总是使用它们是个好主意。)


蝴蝶不菲
浏览 571回答 3
3回答

慕田峪7331174

与顺序流相比,并行流具有更高的开销。协调线程需要大量时间。默认情况下,我将使用顺序流,并且仅在以下情况下考虑并行流:我有大量的项目要处理(或者每个项目的处理需要时间,并且是可并行的)我一开始就有表演问题我还没有在多线程环境中运行进程(例如:在web容器中,如果我已经有许多请求并行处理,那么在每个请求中添加一个额外的并行层可能会产生更多的负面影响而不是积极的影响)。在您的示例中,性能无论如何都将由同步访问System.out.println(),使这一过程并行不会产生任何影响,甚至是负面的影响。此外,请记住,并行流并不能神奇地解决所有同步问题。如果进程中使用的谓词和函数使用共享资源,则必须确保所有内容都是线程安全的。特别是,如果你并行的话,副作用是你必须担心的事情。无论如何,测量,不要猜测!只有度量才能告诉您并行性是否值得。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java