前言
目前正在出一个Java多线程专题长期系列教程,从入门到进阶含源码解读, 篇幅会较多, 喜欢的话,给个关注❤️ ~
本节给大家介绍一下Stream并行流,一起来看下吧~
Stream
从Java8以后,提供了Stream接口以及lambda表达式进行流式计算,这使我们非常方便的处理集合问题,代码也变的更加简洁,高效,想必大家也一定用过。
平时大部分处理的都是串行计算,但是某些场景下我们需要处理并行计算,比如上节给大家讲的fork/join它处理起来就相对复杂一点。
Stream并行流
废话不多说,我们直接上代码,先快速的体验一下:
public class StreamTest { public static void main(String[] args) { Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9) .reduce((a, b) -> { System.out.println(String.format("%s: %d + %d = %d", Thread.currentThread().getName(), a, b, a + b)); return a + b; }) .ifPresent(System.out::println); } } 复制代码
实际输出:
main: 1 + 2 = 3 main: 3 + 3 = 6 main: 6 + 4 = 10 main: 10 + 5 = 15 main: 15 + 6 = 21 main: 21 + 7 = 28 main: 28 + 8 = 36 main: 36 + 9 = 45 45 复制代码
我们可以通过当前线程下的输出,可以看出它一直是在main线程下进行计算的,也就是单线程,下面我们再改造一下:
public static void main(String[] args) { Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9) .parallel() .reduce((a, b) -> { System.out.println(String.format("%s: %d + %d = %d", Thread.currentThread().getName(), a, b, a + b)); return a + b; }) .ifPresent(System.out::println); } 复制代码
实际输出:
ForkJoinPool.commonPool-worker-1: 3 + 4 = 7 ForkJoinPool.commonPool-worker-4: 8 + 9 = 17 ForkJoinPool.commonPool-worker-6: 1 + 2 = 3 main: 5 + 6 = 11 ForkJoinPool.commonPool-worker-6: 3 + 7 = 10 ForkJoinPool.commonPool-worker-4: 7 + 17 = 24 ForkJoinPool.commonPool-worker-4: 11 + 24 = 35 ForkJoinPool.commonPool-worker-4: 10 + 35 = 45 45 复制代码
可以看到,它是一个并行计算,即在多线程下进行的计算,而且可以看出计算速度有明显的提升。从代码来看,就多了一个parallel方法,这个方法是一个中间操作,它可以返回一个等效的并行流
下面我们再看下List中是如何使用的?
public static void main(String[] args) { List<Integer> arr = new ArrayList<>(); arr.add(1); arr.add(2); arr.add(3); arr.add(4); arr.add(5); arr.add(6); arr.parallelStream().reduce((a, b) -> { System.out.println(String.format("%s: %d + %d = %d", Thread.currentThread().getName(), a, b, a + b)); return a + b; }) .ifPresent(System.out::println); } 复制代码
实际输出:
ForkJoinPool.commonPool-worker-4: 5 + 6 = 11 ForkJoinPool.commonPool-worker-1: 2 + 3 = 5 ForkJoinPool.commonPool-worker-4: 4 + 11 = 15 ForkJoinPool.commonPool-worker-1: 1 + 5 = 6 ForkJoinPool.commonPool-worker-1: 6 + 15 = 21 21 复制代码
我们可以直接通过parallelStream来获得一个并行流,是不是很方便。
结束语
本节主要讲解它的一个使用,也不是说全部都用stream并行流,当数据特别多的情况下,可以使用它来提高效率,数据特别少的情况,就不建议使用了。下一节,给大家整理一下本期专题的所有内容,供大家方便去阅读,多线程专题就此完结。关注我,不迷路 ~