【JDK 8-集合框架进阶】6.1 parallelStream 并行流

一、parallelStream 并行流

1.1 串行 和 并行的区别

> 执行结果

二、问题

2.1  paralleStream 并行是否一定比 Stream 串行快?

2.2 是否可以都用并行?

> 报错 

三、实战

> 执行结果

四、总结


一、parallelStream 并行流

  • 多线程并发处理,速度快

  • fork/join 框架提供了并发执行能力

  • 底层原理:线程池(ForkjoinPool) 维护一个线程队列,将父任务拆分成子任务

1.1 串行 和 并行的区别

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9);
        System.out.println(">> 【串行 stream()】单线程");
        list.stream().forEach(System.out::println);
        System.out.println(">> 【并行 parallelStream()】多线程");
        list.parallelStream().forEach(System.out::println);

    }
> 执行结果

二、问题

2.1  paralleStream 并行是否一定比 Stream 串行快?

  • 错误,数据量少的情况,可能串行更快,ForkJoin会耗性能

  • 多数情况下并行比串行快

2.2 是否可以都用并行?

  • 不行,部分情况会有线程安全问题,parallelStream里面使用的外部变量,比如集合一定要使用线程安全集合,不然就会引发多线程安全问题

        for (int i = 0; i < 10; i++) {
            List list1 = new ArrayList();
            IntStream.range(0,100).parallel().forEach(list1::add);
            System.out.println(list1.size());
        }
> 报错 

三、实战

  • 向list插入100个随机[0,100]的int,重复10次
        for (int i = 0; i < 10; i++) {
            List list1 = new CopyOnWriteArrayList();
            IntStream.range(0,100).parallel().forEach(list1::add);
            System.out.println(list1.size());
        }
> 执行结果

四、总结

一般 list.size()

  • 几十个:使用 Stream

  • 几百个以上:paralleStream  

猜你喜欢

转载自blog.csdn.net/ladymorgana/article/details/133043820