本节来了解创建线程的最后一种方式:使用Lambda表达式实现
一、使用Lambda表达式
Lambda表达式是jdk8中所实现的一个新特性,称之为函数式编程,也是一个非常强大的功能
Lambda表达式有非常多的好处也有坏处,我们这里简单提几点它的好处,就是使用Lambda表达式的代码看上去会更加的简洁
另外就是实现起来会更加的方便,然后再就是它对并发的支持是非常好的,使用Lambda表达式写出来的代码可能性能是非常高的
我们本节主要是了解使用Lambda表达式实现并发,或者说让它用多线程去干一件事
我们使用Lambda表达式做一个并行的求和的运算,求一个集合中的值求和,比如从一个文本中读取大量的数值,然后放到一个集合中然后计算这个集合中的值求和
class Demo6{
public int add(List values){
return 0;
}
}
我们首先获取它的并发流parallelStream(),在Java收集器里面有一个parallel收集器这个收集器是并发的,就是说你扔垃圾和扫地是同时进行的,非常强大
而我们要进行sum方法求和返回一个结果int类型的回来,这时我们可以将这个stream 转成一个int stream,这一步可以使用mapToInt()方法
而参数我们可以把这里面迭代出来的每一个元素,让它的值等于a然后在放到一个新的stream中去那么mapToInt所返回的就是一个IntStream
那么我们就可以通过IntStream的sum方法,就可以把转换出来的IntStream里面的元素进行求和
而这时我们在main方法里实践测试看看,是不是可以将集合里的数据求和
class Demo6{
public int add(List values){
return values.parallelStream().mapToInt(a->a).sum();
}
public static void main(String[] args) {
List value = Arrays.asList(10,20,30,40);
int result = new Demo6().add(value);
System.out.println("计算的结果为:"+result);
}
}
//运行结果如下:
计算的结果为:100
二、怎么证明他是并行执行?
那么我们怎么可以说它是一个并行执行的?
其实它底层所用到的原理是我们后面要讲的ForkJoin框架,它底层所依赖的就是ForkJoin框架,它是分而治之的思想。分开,分别计算完之后,然后再合并到一块
我们可以让它来并行的打印一下values集合中的元素,如果它是串行的话,那么肯定是按照顺序打印的,如果是并行执行的话,那么打印出来肯定是乱序的
class Demo6{
public int add(List values){
values.parallelStream().forEach(System.out::println);
return 0;
}
public static void main(String[] args) {
List value = Arrays.asList(10,20,30,40);
int result = new Demo6().add(value);
System.out.println("计算的结果为:"+result);
}
}
//运行结果如下:
30
40
20
10
计算的结果为:0
我们再来验证Stream普通的流,看看它是不是并行执行的
class Demo6{
public int add(List values){
values.stream().forEach(System.out::println);
return 0;
}
public static void main(String[] args) {
List value = Arrays.asList(10,20,30,40);
int result = new Demo6().add(value);
System.out.println("计算的结果为:"+result);
}
}
//运行结果如下:
10
20
30
40
计算的结果为:0
这下我们可以对比两个流的打印结果了,但是我们是并行执行了,但是我就是想让它按原序输出该怎么办呢?
class Demo6{
public int add(List values){
values.parallelStream().forEachOrdered(System.out::println);
return 0;
}
public static void main(String[] args) {
List value = Arrays.asList(10,20,30,40);
int result = new Demo6().add(value);
System.out.println("计算的结果为:"+result);
}
}
//运行结果如下:
10
20
30
40
计算的结果为:0
参考资料
龙果学院:并发编程原理与实战(叶子猿老师)