目录
Stream可以是并行也可以是串行。
一、串行流和并行流的概念
1) 串行流 API:stream()
执行机制:基于pipeline(管道)
流的特性:
1. stream不存储数据
2. stream不改变数据源
3. stream不可重复使用
4. stream串行执行
5. 上个节点会影响下个节点
2) 并行流 API:parallelStream()
二、串行流和并行流的源码比较
1) 串行流
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
2) 并行流
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
不同点:
boolean parallel 是否并行?一个为true一个为false
public static <T> Stream<T> stream(Spliterator<T> spliterator, boolean parallel) {
Objects.requireNonNull(spliterator);
return new ReferencePipeline.Head<>(spliterator,
StreamOpFlag.fromCharacteristics(spliterator),
parallel);
}
3、 关于串行流和并行流的效率比较
串行流上的操作是在一个线程中依次完成
并行流则是在多个线程上同时执行
所以并行流的效率比串行流高。
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>(100);
for (int i = 0; i < 100 ; i++) {
list.add(i);
}
// 串行流
long t1 = System.currentTimeMillis();
long count1 = list.stream().sorted().count();
long t2 = System.currentTimeMillis();
System.out.println(t2-t1);
System.out.println("------------------------上面串行,下面并行-----------------------");
// 并行流
long t3 = System.currentTimeMillis();
long count2 = list.parallelStream().sorted().count();
long t4 = System.currentTimeMillis();
System.out.println(t4-t3);
}
打印结果:i从100-100000万,测试了几十次的打印结果都是并行流的效率高于串行流
97
------------------------上面串行,下面并行-----------------------
12