JDK 1.8特性 Stream是串行还是并行

目录

一、串行流和并行流的概念

二、串行流和并行流的源码比较

3、 关于串行流和并行流的效率比较


Stream可以是并行也可以是串行。

 

一、串行流和并行流的概念

1) 串行流 API:stream()

执行机制:基于pipeline(管道)

  JDK 1.8特性 Stream是串行还是并行

流的特性:

  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

 

上一篇:CPU缓存:L1、L2 和 L3 缓存之间的区别


下一篇:java – Stream.spliterator对并行流的奇怪行为