[一、parallelStream 并行流](#一、parallelStream 并行流)
[1.1 串行 和 并行的区别](#1.1 串行 和 并行的区别)
[> 执行结果](#> 执行结果)
[2.1 paralleStream 并行是否一定比 Stream 串行快?](#2.1 paralleStream 并行是否一定比 Stream 串行快?)
[2.2 是否可以都用并行?](#2.2 是否可以都用并行?)
[> 报错](#> 报错)
[> 执行结果](#> 执行结果)
一、parallelStream 并行流
-
多线程并发处理,速度快
-
fork/join 框架提供了并发执行能力
-
底层原理: 线程池(ForkjoinPool) 维护一个线程队列,将父任务拆分成子任务
1.1 串行 和 并行的区别
java
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9);
System.out.println(">> 【串行 stream()】单线程");
list.stream().forEach(System.out::println);
System.out.println(">> 【并行 parallelStream()】多线程");
list.parallelStream().forEach(System.out::println);
}
> 执行结果
二、问题
2.1 paralleStream 并行是否一定比 Stream 串行快?
-
错误,数据量少的情况,可能串行更快,ForkJoin会耗性能。
-
多数情况下并行比串行快
2.2 是否可以都用并行?
- 不行,部分情况会有线程安全问题,parallelStream里面使用的外部变量,比如集合一定要使用线程安全集合,不然就会引发多线程安全问题
java
for (int i = 0; i < 10; i++) {
List list1 = new ArrayList();
IntStream.range(0,100).parallel().forEach(list1::add);
System.out.println(list1.size());
}
> 报错
三、实战
java
for (int i = 0; i < 10; i++) {
List list1 = new CopyOnWriteArrayList();
IntStream.range(0,100).parallel().forEach(list1::add);
System.out.println(list1.size());
}
> 执行结果
四、总结
一般 list.size()
-
几十个:使用 Stream
-
几百个以上:paralleStream