JUC并发编程之Fork、Join分支合并框架

目录

13. 分支合并:ForkJoin

13.1 Fork/Join 框架简介

13.2 Fork 方法

13.3 入门案例


13. 分支合并:ForkJoin

13.1 Fork/Join 框架简介

Fork/Join 它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子 任务结果合并成最后的计算结果,并进行输出。Fork/Join 框架要完成两件事情:

  • Fork:把一个复杂任务进行分拆,大事化小
  • Join:把分拆任务的结果进行合并

JUC并发编程之Fork、Join分支合并框架_第1张图片

1. 任务分割:首先 Fork/Join 框架需要把大的任务分割成足够小的子任务,如果 子任务比较大的话还要对子任务进行继续分割

2. 执行任务并合并结果:分割的子任务分别放到双端队列里,然后几个启动线程 分别从双端队列里获取任务执行。子任务执行完的结果都放在另外一个队列里, 启动一个线程从队列里取数据,然后合并这些数据。

JUC并发编程之Fork、Join分支合并框架_第2张图片

Fork/Join 框架的实现原理

ForkJoinPool 由 ForkJoinTask 数组和 ForkJoinWorkerThread 数组组成,

ForkJoinTask 数组负责将存放以及将程序提交给 ForkJoinPool,而 ForkJoinWorkerThread 负责执行这些任务。

13.2 Fork 方法

JUC并发编程之Fork、Join分支合并框架_第3张图片

JUC并发编程之Fork、Join分支合并框架_第4张图片

Fork 方法的实现原理:

当我们调用 ForkJoinTask 的 fork 方法时,程序会把 任务放在 ForkJoinWorkerThread 的 pushTask 的 workQueue 中,异步地 执行这个任务,然后立即返回结果 public final ForkJoi

13.3 入门案例

场景: 生成一个计算任务,计算 1+2+3.........+1000, 每100个数切分一个子任务

    /**
    * 递归累加
    */
public class TaskExample extends RecursiveTask {
    private int start;
    private int end;
    private long sum;
        /**
        * 构造函数
        * @param start
        * @param end
        */

    public TaskExample(int start, int end){
        this.start = start;
        this.end = end;
    }

    /**
    * The main computation performed by this task.
    *
    * @return the result of the computation
    */

    @Override
    protected Long compute() {

        System.out.println("任务" + start + "=========" + end + "累加开始");
            // 大于 100 个数相加切分,小于直接加
        if(end - start <= 100){
            for (int i = start; i <= end; i++) {
           
                 //累加
                sum += i;

            }
         }else {

            //切分为 2 块
        int middle = start + 100;

                //递归调用,切分为 2 个小任务
            TaskExample taskExample1 = new TaskExample(start, middle);
            TaskExample taskExample2 = new TaskExample(middle + 1, end);
            
                //执行:异步
            taskExample1.fork();
            taskExample2.fork();

               //同步阻塞获取执行结果
            sum = taskExample1.join() + taskExample2.join();
    }

    //加完返回
    return sum;

    }
}

 Main函数

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;

public class ForkJoinPoolDemo {
     /**
     * 生成一个计算任务,计算 1+2+3.........+1000
     * @param args
     */
    public static void main(String[] args) {
     
           //定义任务
       TaskExample taskExample = new TaskExample(1, 1000);
         //定义执行对象
       ForkJoinPool forkJoinPool = new ForkJoinPool();
           //加入任务执行
       ForkJoinTask result = forkJoinPool.submit(taskExample);
        //输出结果
 
     try {
       System.out.println(result.get());
       
     }catch (Exception e){
       e.printStackTrace();
     }finally {
      
     forkJoinPool.shutdown();
    }
     
  }
}

你可能感兴趣的:(JUC并发编程,github)