JDK8 lambda随笔 - 并行篇
JDK8 lambda随笔 - 并行篇
前言
java8最大的改动之一lambda表达式自面世后就引来了各种讨论,本文不在此探讨优劣以及具体的用法。仅简单的介绍下parallel streams,并探讨适用场景。
外链
parallel streams
- parallel stream是默认使用forkJoinPool来支持java任务并行执行。使用方法如下所示:
List<Integer> cost = Lists.newArrayList(1, 3, 7, 9, 34);
long total = cost.parallelStream().map(x -> x += 1).reduce((y, z) -> y + z).get();
可以看出,比起现有的java多线程代码至少也要数10行代码,写起来要简单很多,并且不需要用户自己给java任务执行分片,也不需要设置线程池数量(默认使用本机的核数)。总而言之这种方法的最大的优点就是:简单。但是在如下场景仍然不建议用户使用parallelStream:
- 并行任务量极少且单个任务执行时间并不长。
- 系统本身并不存在性能瓶颈。
- 本身就是多线程的web系统,比如各大电商网站的核心交易系统等。
同时仍然需要注意当map和filter函数里面的写法,保证线程安全。
设置线程数量
- 使用默认线程池数量
List<Integer> cost = Lists.newArrayList(1, 3, 7, 9, 34);
long total = cost.parallelStream().map(x -> x += 1).reduce((y, z) -> y + z).get();
- 定制线程池数量
final ForkJoinPool pool = new ForkJoinPool(4);
List<Integer> cost = Lists.newArrayList(1, 3, 7, 9, 34);
pool.submit(() -> cost.parallelStream().map(x -> x += 1).reduce((y, z) -> y + z).get());

浙公网安备 33010602011771号