本节来理解创立线程的最初一种形式:应用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
参考资料
龙果学院:并发编程原理与实战(叶子猿老师)