2.6 如果可能,是否应该始终使用并行流? | Java Debug 笔记

97 阅读1分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

提问:如果可能,是否应该始终使用并行流?

使用Java 8的lambda,可以很容易地将集合作为流进行迭代,也很容易将集合作为并行流进行迭代。以下给出的两个示例,第二个示例使用parallelStream:

myShapesCollection.stream()
    .filter(e -> e.getColor() == Color.RED)
    .forEach(e -> System.out.println(e.getName()));

myShapesCollection.parallelStream() // <-- 这个用了并行流进行迭代
    .filter(e -> e.getColor() == Color.RED)
    .forEach(e -> System.out.println(e.getName()));

在我不关心迭代顺序的前提下,使用并行控件总是有好处的吗?有人会认为,并行控件可以更快地将工作划分到更多的内核上。

还有其他需要在编码时考虑的问题吗?什么时候应该使用并行流,什么时候应该使用非并行流? (问这个问题可以引发关于如何以及何时使用并行流的讨论,不是因为我认为始终使用并行流是一个好主意。) 回答1: 与顺序流相比,并行流的开销要高得多。协调线程需要花费大量时间。我将默认使用顺序流,并且仅在以下情况下考虑并行流:

  • 我要处理大量项目(或者说每个项目的处理都需要时间并且可以并行化处理这些项目)
  • 在顺序流的编程中,我遇到了性能问题。
  • 我在当前并未使用并行(例如:在Web容器中,如果我已经有许多并行处理的请求,则在每个请求中添加额外的并行操作可能会弊大于利)