ParallelStream并行流在之前文章Java8新特性-Stream API中有简单的介绍过它的使用。如Collection集合可以通过parallelStream()的得到一个并行流。
Stream<Integer> stream = new ArrayList<Integer>().parallelStream();
串行流也可以通过parallel()方法转为并行流
Stream<Integer> stream = new ArrayList<Integer>().stream().parallel();
笔者在学习的过程中,也对并行流有着很多的疑问
- 串行流和并行流哪个效率更高?(这还有疑问吗?肯定是并行流呀?sure?)
- 并行流得到的结果是否一定准确?
- 它的实现机制是什么样的?
- 开发中可以使用并行流嘛?
现在就让我们来深入了解一下Java8的这个新特性——并行流
并行流的效率是否更高
在Java8以前,遍历一个长度非常大的集合往往非常麻烦,如需要使用多个线程配合synchronized,Lock和Atomic原子引用等进行遍历,且不说多线程之间的调度,多线程同步API的上手成本也比较高。
现在我们有更为简单的遍历方式,且不局限于遍历集合。
先往一个List添加10万条记录,代码比较简单,单条记录的内容使用UUID随机生成的英文字符串填充
List<String> list = new ArrayList<String>();
for (int i = 0; i < 100000; i++) {
list.add(UUID.randomUUID().toString());
}
普通for循环该List,然后将每条记录中的a替换成b
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
String replace = s.replace("a", "b");
}
注意:这里使用String replace = s.replace("a", "b");这一行代码作为简单的业务处理,而不是System.out.println(s),因为打印的时候存在synchronized同步机制,会严重影响并行流的效率!
增强for循环
for (String s : list) {
String replace = s.replace("a", "b");
}
串行流
list.stream().forEach((