JUC个人学习笔记12--ForkJoin
根据b站UP主狂神说JUC课程所写的个人学习笔记 视频地址:https://www.bilibili.com/video/BV1B7411L7tE?from=search&seid=14761503393031794075
Forkjoin在jdk1.7,并行执行任务,提高效率,大数据量
大数据:Map Reduce(把大任务拆分为小任务)
Forkjoin特点:工作窃取
维护的都是双端队列
Forkjoin
//求和计算 //3 6(forkjoin) 9 (stream并行流) //如何使用forkjoin //1.forkjoinpool //2.计算任务 //forkJoinPool.execute(ForkJoinTask task) //3.计算类继承forkjointask public class ForkjoinDemo extends RecursiveTask<Long> { private Long start; //1 private Long end; //19999999 private Long temp = 1000000L; public ForkjoinDemo(Long start, Long end) { this.start = start; this.end = end; } //计算方法 @Override protected Long compute() { if(end-start>=temp){ //分支合并计算 Long mid = (start + end)/2;//中间值 ForkjoinDemo forkjoinDemo = new ForkjoinDemo(start, mid ); forkjoinDemo.fork();//拆分任务,把任务压入线程队列 ForkjoinDemo forkjoinDemo1 = new ForkjoinDemo(mid+1,end); forkjoinDemo1.fork(); return forkjoinDemo.join() + forkjoinDemo1.join(); } else{ Long sum = 0L; for (Long i = start; i < end; i++) { sum += i ; } return sum; } } }
public class Test { public static void main(String[] args) throws ExecutionException, InterruptedException { test3(); } //普通程序员 public static void test1(){ Long sum = 0L; Long start = System.currentTimeMillis(); for (int i = 0; i < 10_0000_0000; i++) { sum +=i ; } Long end = System.currentTimeMillis(); System.out.println("sum="+sum+"时间:"+(end-start)); } //会使用forkjoin public static void test2() throws ExecutionException, InterruptedException { Long start = System.currentTimeMillis(); ForkJoinPool forkJoinPool = new ForkJoinPool(); ForkjoinDemo forkjoinDemo = new ForkjoinDemo(0L, 10_0000_0000L); ForkJoinTask<Long> submit = forkJoinPool.submit(forkjoinDemo); Long aLong = submit.get(); Long end = System.currentTimeMillis(); System.out.println("sum="+aLong+"时间:"+(end-start)); } //stream并行流 public static void test3(){ Long start = System.currentTimeMillis(); long reduce = LongStream.rangeClosed(0L, 10_0000_0000L).parallel().reduce(0, Long::sum); Long end = System.currentTimeMillis(); System.out.println("sum="+"时间:"+(end-start)); } }