JUC并发编程ForkJoin(十五)

ForkJoin

什么是ForkJoin?

 ForkJoin在JDk1.7 并行执行任务!提高效率  大数据量

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

 

ForkJoin特点:工作窃取

这里面维护的都是双端队列

 

package com.xizi.forkjoin;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
import java.util.stream.LongStream;

/**
 * 求和任务
 *  ForkJoin    Stream并行流
 */
/*
如何使用forkjoin
1.forkjoinPool 通过它来执行
2.计算任务 forkjoinPool.execute(ForkJoinTask task)
3.计算类要继承 ForkJoinTask



 */


public class ForkJoin extends RecursiveTask<Long> {
    private Long start;
    private Long end;

    private Long temp = 10000L;

    public ForkJoin(Long start, long end) {
        this.start = start;
        this.end = end;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
          test(); //sum=500000000500000000时间:  7416
        test2();  //sum=500000000500000000时间:  10713
        test3();//sum=500000000500000000时间:  270
    }

    public static void test(){
        long start = System.currentTimeMillis();
        Long sum = 0L;
        for (Long i = 0L; i <= 10_0000_0000L; i++) {
            sum += i;
        }
        long end = System.currentTimeMillis();
        System.out.println("sum="+sum+"时间:  "+(end-start));
    }

    public static void test2() throws ExecutionException, InterruptedException {
        long start = System.currentTimeMillis();
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoin task = new ForkJoin(0L, 10_0000_0000L);
        ForkJoinTask<Long> submit = forkJoinPool.submit(task);
        Long sum = submit.get();
        long end = System.currentTimeMillis();
        System.out.println("sum="+sum+"时间:  "+(end-start));
    }

    public  static  void test3(){
        long start = System.currentTimeMillis();
        //stream并行流()
        long sum = LongStream.rangeClosed(0L, 10_0000_0000L).parallel().reduce(0, Long::sum);
        long end = System.currentTimeMillis();
        System.out.println("sum="+sum+"时间:  "+(end-start));
    }

    @Override
    protected Long compute() {
        if ((end - start) < temp) {
            Long sum = 0L;
            for (Long i = start; i <= end; i++) {
                sum += i;
            }
            return sum;
        } else {
            long middle = (start + end) / 2;
            ForkJoin task1 = new ForkJoin(start, middle);
            task1.fork();//拆分任务,把任务压入线程队列
            ForkJoin task2 = new ForkJoin(middle+1, end);
            task2.fork();//拆分任务,把任务压入线程队列
            return task1.join()+task2.join();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_45480785/article/details/105378945