前言
目前正在出一个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并行流,当数据特别多的情况下,可以使用它来提高效率,数据特别少的情况,就不建议使用了。下一节,给大家整理一下本期专题的所有内容,供大家方便去阅读,多线程专题就此完结。关注我,不迷路 ~