文章来源: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呢?可以从以下三点入手考虑
- 是否需要并行?
- 任务之间是否是独立的?是否会引起任何竞态条件?
- 结果是否取决于任务的调用顺序?