stream和parallelstream的区别

 先上代码

public static void main(String[] args){
		
		List 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 list = new ArrayList();
        for (int j = 0; j < 10000; j++) {
            list.add(j);
        }
        // 统计并行执行list的线程
        Set 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 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");
       
        
	}
	MICROSECONDS    微秒  
	MILLISECONDS    毫秒  
	NANOSECONDS   毫微秒  
	SECONDS          秒
	MINUTES         分钟
	HOURS           小时
	DAYS             天

结果如下:

传统for循环运行时间:21058ms
stream : 20315ms
parallelStream : 2441ms

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

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

  1. 是否需要并行?  
  2. 任务之间是否是独立的?是否会引起任何竞态条件?  
  3. 结果是否取决于任务的调用顺序?

微信扫描下方二维码(新开通的个人微信公众号)  更多优质资源及优质文章及时获取 请大家多多支持哦

参考文章:https://blog.csdn.net/darrensty/article/details/79283146

                  https://blog.csdn.net/Crystalqy/article/details/79310058


 

你可能感兴趣的:(java,java8)