本节来理解创立线程的最初一种形式:应用Lambda表达式实现

一、应用Lambda表达式


Lambda表达式是jdk8中所实现的一个新个性,称之为函数式编程,也是一个十分弱小的性能

Lambda表达式有十分多的益处也有害处,咱们这里简略提几点它的益处,就是应用Lambda表达式的代码看上去会更加的简洁

另外就是实现起来会更加的不便,而后再就是它对并发的反对是十分好的,应用Lambda表达式写进去的代码可能性能是十分高的

咱们本节次要是理解应用Lambda表达式实现并发,或者说让它用多线程去干一件事

咱们应用Lambda表达式做一个并行的求和的运算,求一个汇合中的值求和,比方从一个文本中读取大量的数值,而后放到一个汇合中而后计算这个汇合中的值求和

class Demo6{    public int add(List<Integer> 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<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);    }}//运行后果如下:30402010计算的后果为: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);    }}//运行后果如下:10203040计算的后果为: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);    }}//运行后果如下:10203040计算的后果为:0

参考资料


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