Stream 流的并行 API 主要就是 ** parallelStream() ** 和 ** parallel() **。

比如普通串行流:

list.stream()
    .forEach(System.out::println);

改成并行流:

list.parallelStream()
    .forEach(System.out::println);

也可以先创建普通 Stream,再转换:

list.stream()
    .parallel()
    .forEach(System.out::println);

两者最终都是得到 并行 Stream。

它是怎么并行的?

可以简单理解成把一批数据拆成多个小任务,让多个线程同时处理,最后再合并结果:

[1,2,3,4,5,6,7,8]
        ↓
      拆分
   ↙    ↓    ↘
[1,2] [3,4] [5,6] [7,8]
   ↓     ↓     ↓     ↓
 线程1  线程2  线程3  线程4
   ↘     ↓     ↓     ↙
        合并结果

Java 8 的并行 Stream 底层主要依赖 Fork/Join 框架,默认通常使用:

ForkJoinPool.commonPool()

面试怎么回答?

如果面试官问:

Stream 流的并行 API 是什么?

可以回答:

Java Stream 可以通过 parallelStream() 直接创建并行流,也可以通过普通 Stream 的 parallel() 方法转换成并行流。并行 Stream 会将数据拆分成多个任务并行处理,底层主要基于 Fork/Join 框架,默认通常使用 ForkJoinPool.commonPool()。不过并行流并不一定比串行流快,因为任务拆分、线程调度和结果合并本身也有开销,而且还需要注意线程安全问题。

再记一个对应关系就行:

stream()          → 串行流
parallelStream()  → 并行流
 
parallel()        → 转并行
sequential()      → 转串行

实习八股问到这里,基本就够了。