其他分享
首页 > 其他分享> > JDK 1.8特性 Stream是串行还是并行

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

作者:互联网

目录

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

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

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


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

 

标签:long,Stream,stream,1.8,并行,System,JDK,spliterator,串行
来源: https://blog.csdn.net/zheng2780071070/article/details/114954918