JUC编程09:ForkJoin

一、什么是ForkJoin?

1、概念

  • ForkJoin 从 JDK 1.7开始 , 并行执行任务。
  • 在大数据量下,能够提高效率。
  • 它能够将大任务拆分成小的任务。
  • 底层维护的是一个双端队列
  • 特点为工作窃取
    JUC编程09:ForkJoin_第1张图片
    JUC编程09:ForkJoin_第2张图片
    JUC编程09:ForkJoin_第3张图片

二、代码演示

public class ForkjoinDemo extends RecursiveTask {

    private Long start;
    private Long end;

    //设置临界值
    private Long temp=10000L;

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

  /*
    1、通过forkjoinPool来执行
    2、计算任务forkjoinPool.execute(ForkJoinTask task)
    3. 计算类要继承RecursiveTask(递归任务,有返回值的)
    */
  @Override
  protected Long compute() {

      if ((end-start)
public class ForkJoinTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
          test01();
          test02();
          test03();
    }

    //普通的累加方法
    public static void test01(){
        Long sum=0L;
        long start = System.currentTimeMillis();
        for (long i=1L;i<=10_0000_0000;i++){
            sum+=i;
        }
        long end = System.currentTimeMillis();
        System.out.println("普通方式花费了----->"+(end-start)+"毫秒");
    }

    //使用forkjoin
    public static void test02() throws ExecutionException, InterruptedException {
        long start = System.currentTimeMillis();
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask task = new ForkjoinDemo(
                0L, 10_0000_0000L);
        // 提交任务
        ForkJoinTask submit = forkJoinPool.submit(task);
        Long sum = submit.get();// 获得结果
        long end = System.currentTimeMillis();
        System.out.println("sum="+sum+" 时间:"+(end-start));
    }

    //使用stream并行流
    public static void test03(){
        long start = System.currentTimeMillis();
        LongStream
                .rangeClosed(0L,10_0000_0000)   //计算范围(]
                .parallel()  //并行计算
                .reduce(0,Long::sum);  //输出结果
        long end = System.currentTimeMillis();
        System.out.println("并行流花费了---->"+(end-start)+"毫秒");
    }
}

你可能感兴趣的:(JUC编程,forkJoin,大数据计算优化)