前言:
现在小伙伴们对“java流的传递方式是并行还是串行”大体比较重视,你们都需要分析一些“java流的传递方式是并行还是串行”的相关知识。那么小编在网摘上网罗了一些有关“java流的传递方式是并行还是串行””的相关内容,希望各位老铁们能喜欢,朋友们快快来学习一下吧!使用for循环,串行Stream流,并行Stream流来对5亿个数字求和。看消耗的时间。
public class Demo06 {private static long times = 50000000000L;private long start; @Before public void init() { start = System.currentTimeMillis(); } @After public void destory() { long end = System.currentTimeMillis(); System.out.println("消耗时间: " + (end - start)); } // 测试效率,parallelStream 120 @Test public void parallelStream() { System.out.println("serialStream"); LongStream.rangeClosed(0, times) .parallel() .reduce(0, Long::sum); } // 测试效率,普通Stream 342 @Test public void serialStream() { System.out.println("serialStream"); LongStream.rangeClosed(0, times) .reduce(0, Long::sum); } // 测试效率,正常for循环 421 @Test public void forAdd() { System.out.println("forAdd"); long result = 0L; for (long i = 1L; i < times; i++) { result += i; } }}
我们可以看到parallelStream的效率是最高的。
Stream并行处理的过程会分而治之,也就是将一个大任务切分成多个小任务,这表示每个任务都是一个操作。
parallelStream线程安全问题
解决parallelStream线程安全问题
// 并行流注意事项@Testpublic void parallelStreamNotice() { ArrayList<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < 1000; i++) { list.add(i); } List<Integer> newList = new ArrayList<>(); // 使用并行的流往集合中添加数据 list.parallelStream() .forEach(s -> { newList.add(s); }); System.out.println("newList = " + newList.size());}
运行效果:
newList = 903
我们明明是往集合中添加1000个元素,而实际上只有903个元素。
解决方法:
加锁、使用线程安全的集合或者调用Stream的 toArray() / collect() 操作就是满足线程安全的了。
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #java流的传递方式是并行还是串行