我所知道并发编程之使用JDK8提供的lambda进行并行计算

本节来了解创建线程的最后一种方式:使用Lambda表达式实现

一、使用Lambda表达式


Lambda表达式是jdk8中所实现的一个新特性,称之为函数式编程,也是一个非常强大的功能

Lambda表达式有非常多的好处也有坏处,我们这里简单提几点它的好处,就是使用Lambda表达式的代码看上去会更加的简洁

另外就是实现起来会更加的方便,然后再就是它对并发的支持是非常好的,使用Lambda表达式写出来的代码可能性能是非常高的

我们本节主要是了解使用Lambda表达式实现并发,或者说让它用多线程去干一件事

我们使用Lambda表达式做一个并行的求和的运算,求一个集合中的值求和,比如从一个文本中读取大量的数值,然后放到一个集合中然后计算这个集合中的值求和

class Demo6{
    public int add(List<Integer> values){
        return 0;
    }
}

我们首先获取它的并发流parallelStream(),在Java收集器里面有一个parallel收集器这个收集器是并发的,就是说你扔垃圾和扫地是同时进行的,非常强大

image.png

而我们要进行sum方法求和返回一个结果int类型的回来,这时我们可以将这个stream 转成一个int stream,这一步可以使用mapToInt()方法

image.png

而参数我们可以把这里面迭代出来的每一个元素,让它的值等于a然后在放到一个新的stream中去那么mapToInt所返回的就是一个IntStream

image.png

那么我们就可以通过IntStream的sum方法,就可以把转换出来的IntStream里面的元素进行求和

image.png

而这时我们在main方法里实践测试看看,是不是可以将集合里的数据求和

class Demo6{

    public int add(List<Integer> values){
        return values.parallelStream().mapToInt(a->a).sum();
    }

    public static void main(String[] args) {

        List<Integer> 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<Integer> values){
        values.parallelStream().forEach(System.out::println);
        return 0;
    }

    public static void main(String[] args) {

        List<Integer> 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<Integer> values){
        values.stream().forEach(System.out::println);
        return 0;
    }

    public static void main(String[] args) {

        List<Integer> 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<Integer> values){
        values.parallelStream().forEachOrdered(System.out::println);
        return 0;
    }

    public static void main(String[] args) {

        List<Integer> value = Arrays.asList(10,20,30,40);
        int result = new Demo6().add(value);
        System.out.println("计算的结果为:"+result);
    }
}
//运行结果如下:
10
20
30
40
计算的结果为:0

参考资料


龙果学院:并发编程原理与实战(叶子猿老师)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值