• stream和parallelstream的区别


    文章来源:https://blog.csdn.net/lihua5419/article/details/86678860

    先上代码

    public static void main(String[] args){
            List<Integer> i=Arrays.asList(1,2,3,4,5,6,7);
            System.out.println("stream.forEach打印结果如下");
            i.stream().forEach(System.out :: println);//固定结果 1234567
            System.out.println("parallelStream.forEach打印结果如下");
            i.parallelStream().forEach(System.out :: println);//每次的结果都不同
            System.out.println("parallelStream.forEachOrdered打印结果如下");
            i.parallelStream().forEachOrdered(System.out :: println);//结果同stream.forEach 
    }

    通过打印结果发现parallelStream每次执行的结果都不相同,与多线程程序中执行的结果类似。

    于是乎便有了以下代码:

    public static void main(String[] args){
            //模拟10000条数据 循环打印测试
            List<Integer> list = new ArrayList();
            for (int j = 0; j < 10000; j++) {
                list.add(j);
            }
            // 统计并行执行list的线程
            Set<Thread> threadSet = new CopyOnWriteArraySet<>();
            // 并行执行
            list.parallelStream().forEach(integer -> {
                Thread thread = Thread.currentThread();
                // 统计并行执行list的线程
                threadSet.add(thread);
            });
            System.out.println(threadSet);
            System.out.println("threadSet一共有" + threadSet.size() + "个线程");//打印结果由此证明parallelStream是多管道线程
            System.out.println("系统一个有"+Runtime.getRuntime().availableProcessors()+"个cpu");
    }

    打印的结果每次都不相同,那么stream和parallelstream执行起来的效率又有什么区别呢?

    又于是乎,便有了以下代码:

        
    public static void main(String[] args) throws InterruptedException {
        
            //模拟10000条数据 forEach打印测试
            List<Integer> list = new ArrayList();
            for (int j = 0; j < 10000; j++) {
                list.add(j);
            }
            
            //下面测试下各方法执行的时间 检查效率
            long startTime = System.currentTimeMillis();
            for (int i = 0; i < list.size(); i++) {
                try {
                  TimeUnit.MILLISECONDS.sleep(1);//睡眠1毫秒
                } catch (InterruptedException e) {
                  e.printStackTrace();
                }
              }
            long endTime = System.currentTimeMillis();
            System.out.println("传统for循环运行时间:" + (endTime - startTime) + "ms");
     
            // 测试单管道stream执行效率
            startTime = System.currentTimeMillis();
            list.stream().forEach(r -> {
                try {
                  TimeUnit.MILLISECONDS.sleep(1);//睡眠1毫秒
                } catch (Exception e) {
                  e.printStackTrace();
                }
              });
              long streamendTime = System.currentTimeMillis();
              System.out.println("stream : " + (streamendTime - startTime) + "ms");
     
              // 测试多管道parallelStream执行效率
              startTime = System.currentTimeMillis();
              list.parallelStream().forEach(r -> {
                try {
                  TimeUnit.MILLISECONDS.sleep(1);//睡眠1毫秒
                } catch (Exception e) {
                  e.printStackTrace();
                }
              });
              long parallelStreamendTime = System.currentTimeMillis();
              System.out.println("parallelStream : " + (parallelStreamendTime - startTime) + "ms");
    }
    传统for循环运行时间:21058ms
    stream : 20315ms
    parallelStream : 2441ms

    对比发现parallelStream执行效率要比传统的for循环和stream要快的多,

    那么什么时候要用stream或者parallelStream呢?可以从以下三点入手考虑

    1. 是否需要并行?  
    2. 任务之间是否是独立的?是否会引起任何竞态条件?  
    3. 结果是否取决于任务的调用顺序?
  • 相关阅读:
    实现IEnumberable接口和IEnumberator
    XAML-1
    Java基础00-Java概述1
    详解Lombok中的@Builder用法
    stream之map的用法
    stream之forEach的用法
    Java中map.getOrDefault()方法的使用
    BiPredicate的test()方法
    Function.identity()
    java 8 lamda Stream的Collectors.toMap 参数
  • 原文地址:https://www.cnblogs.com/ooo0/p/14445657.html
Copyright © 2020-2023  润新知