乐趣区

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

本节来理解创立线程的最初一种形式:应用 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);
    }
}
// 运行后果如下: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

参考资料


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

退出移动版