Java8新特性-012-并行流与串行流
2018-01-06 13:58
393 查看
概述
并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。Java 8 中将并行进行了优化,我们可以很容易的对数据进行并行操作。Stream API 可以声明性地通过parallel() 与sequential() 在并行流与顺序流之间进行切换。
了解Fork/Join 框架
Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小任务运算的结果进行join 汇总。Fork/Join 框架与传统线程池的区别
采用“工作窃取”模式(work-stealing):当执行新的任务时它可以将其拆分分成更小的任务执行,并将小任务加到线程队列中,然后再从一个随机线程的队列中偷一个并把它放在自己的队列中。
相对于一般的线程池实现,fork/join框架的优势体现在对其中包含的任务的处理方式上.在一般的线程池中,如果一个线程正在执行的任务由于某些原因无法继续运行,那么该线程会处于等待状态.而在fork/join框架实现中,如果某个子问题由于等待另外一个子问题的完成而无法继续运行.那么处理该子问题的线程会主动寻找其他尚未运行的子问题来执行.这种方式减少了线程的等待时间,提高了性能。
测试代码
ForkJoin.javapackage java8.stream; import java.text.SimpleDateFormat; import java.time.Duration; import java.time.Instant; import java.util.Date; import java.util.Locale; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.RecursiveTask; /** * @author 微信公众号:JavaWeb架构师 * @version 创建时间:4 Jan 2018 20:57:17 */ /** * Fork、Join模式使用: * 1.继承抽象类RecusiveTask(有返回值,泛型指定返回值)或者抽象类RecusiveAction(无返回值) * 2.实现其中的compute方法,以递归形式拆分任务 * 3.任务拆分完成之后,调用fork,压入线程队列 * 4.任务处理完成之后,调用join,返回值 * 5.运行程序时,需要ForkJoinPool的支持 * 5.1.新建ForkJoinPool * 5.2.用父类ForkJoinTask去引用需要新建的对象 * 5.3.调用ForkJoinPool的invoke,进行fork/join,接收返回值 * */ // 数字累加,使用fork/join // 1.继承抽象类RecusiveTask(有返回值,泛型指定返回值)或者抽象类RecusiveAction(无返回值) public class ForkJoin extends RecursiveTask<Long> { private static final long serialVersionUID = 3068035464321801227L; public static void main(String[] args) { Instant start = Instant.now(); // 5.1.新建ForkJoinPool ForkJoinPool pool = new ForkJoinPool(); // 5.2.用父类ForkJoinTask去引用需要新建的对象 ForkJoinTask<Long> fjt = new ForkJoin(1, 100000L); // 5.3.调用ForkJoinPool的invoke,进行fork/join,接收返回值 Long sum = pool.invoke(fjt); System.out.println("总和是:" + sum); Instant end = Instant.now(); System.out.println("耗时:" + Duration.between(start, end).toMillis() + "毫秒!"); } // 处理任务的起始值 private long start; // 处理任务的终止值 private long end; // 被拆分后的最小单位 private static final long THRESHOLD = 10000; // 2.实现其中的compute方法,以递归形式拆分任务 @Override protected Long compute() { long length = end - start; // 已经拆分到最小单位了 if(length <= THRESHOLD) { long sum = 0; for (long i = start; i <= end; i++) { sum += i; } return sum; // 未到达最小单位,还要递归,继续拆分 } else { long middle = (start + end)/2; // 3.任务拆分完成之后,调用fork,压入线程队列 // 进行fork // 左边一半 ForkJoin left = new ForkJoin(start,middle); left.fork(); // 拆分子任务,同时压入线程队列 // 右边一半 ForkJoin right = new ForkJoin(middle + 1,end); right.fork(); // 4.任务处理完成之后,调用join,返回值 // 左右总和join,返回给上一级 return left.join() + right.join(); } } public ForkJoin(long start, long end) { super(); this.start = start; this.end = end; } }
测试代码
TestParallelSequential.javapackage java8.stream; import java.util.ArrayList; import java.util.List; import java.util.stream.LongStream; import org.junit.Test; /** * @author 微信公众号:JavaWeb架构师 * @version 创建时间:5 Jan 2018 10:43:20 */ public class TestStreamParallelSequential { /** * Stream中的并行流与串行流: * 1.基于Fork/Join框架 * 2.使用方法: * 2.1.获取时: * stream()方法:获取串行流 * parallelStream()方法:获取并行流 * 2.2.对流进行转换 * parallel()方法:转换当前流为并行流 * sequential()方法:转换当前流为串行流 */ // 1.parallelStream()方法:获取并行流 @Test public void test1() { List<Long> longList = new ArrayList<>(); for (long i = 0; i < 1000000L; i++) { longList.add(i); } Long sum = longList.parallelStream() .reduce(0L,Long::sum); System.out.println("总和是:" + sum); // 总和是:499999500000 } // 2.parallel()方法:转换当前流为并行流 @Test public void test2() { long sum = LongStream.rangeClosed(0,10000000L) // parallel方法,转换当前流为并行流 .parallel() .reduce(0,Long::sum); System.out.println("总和是:" + sum); // 总和是:50000005000000 } }
其它
源码下载关注下方公众号,回复:Java8.code
欢迎加入交流群:451826376
更多信息:www.itcourse.top
相关文章推荐
- JAVA8新特性[第五季]-并行流与串行流
- Java8新特性之并行流与串行流
- Java 并发编程实战学习笔记——串行任务转并行任务
- java8新特性(六):Stream多线程并行数据处理
- 详解Java8特性之Stream API并行流
- java8,你应该了解的新特性(并行流优化篇)
- java 定时任务串行并行
- java8新特性:Stream多线程并行数据处理
- java基础——串行与并行
- java8新特性(六):Stream多线程并行数据处理
- Java串行程序并行化执行
- java8 新特性(七)之Nashorn JavaScript引擎 / 对Base64编码的支持 / 并行数组 / 并发性
- java并行,并发,串行,同步,异步,阻塞,非阻塞,同步阻塞,同步非阻塞,异步阻塞,异步非阻塞
- Java 7新特性(五)——更强的并行处理能力
- Java 浅析三大特性之一继承
- javaSE_8系列博客——Java语言的特性(四)--注解--(1)--基础知识
- java 高级特性
- Java8新特性之Optional
- java提高篇(三)-----理解java的三大特性之多态
- Java三大特性