JUC个人学习笔记12--ForkJoin

根据b站UP主狂神说JUC课程所写的个人学习笔记 视频地址:https://www.bilibili.com/video/BV1B7411L7tE?from=search&seid=14761503393031794075


Forkjoin在jdk1.7,并行执行任务,提高效率,大数据量

大数据:Map Reduce(把大任务拆分为小任务)

JUC个人学习笔记12--ForkJoin

Forkjoin特点:工作窃取

维护的都是双端队列

JUC个人学习笔记12--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));
    }
}