0
点赞
收藏
分享

微信扫一扫

Fork/Join 框架简介

寒羽鹿 2022-01-05 阅读 91

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

Fork:把一个复杂任务进行分拆,大事化小

Join:把分拆任务的结果进行合并

1. 任务分割 :首先 Fork/Join 框架需要把大的任务分割成足够小的子任务,如果

子任务比较大的话还要对子任务进行继续分割

2. 执行任务并合并结果 :分割的子任务分别放到双端队列里,然后几个启动线程

分别从双端队列里获取任务执行。子任务执行完的结果都放在另外一个队列里,

启动一个线程从队列里取数据,然后合并这些数据。

在 Java 的 Fork/Join 框架中,使用两个类完成上述操作

计算1到100相加的结果,以10个为一轮,分支合并相加

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

/**
 * @author zhang.rongshan
 * @create 2022-01-04 下午11:03
 */

class MyFork extends RecursiveTask<Integer> {
    //拆分差值不超过10,计算10以内运算
    private static final Integer Vaule = 10;
    private int begin; //拆分开始
    private int end; //拆分结束
    private int result;//返回结果

    public MyFork(int begin, int end) {
        this.begin = begin;
        this.end = end;

    }

    @Override
    protected Integer compute() {

        if ((end - begin) <= Vaule) {
            //相加操作
            for (int i = begin; i <= end; i++) {
                result = result + i;

            }

        } else {
            //获取中间值
            int middle = (begin + end) / 2;
            //拆分左边
            MyFork myFork1 = new MyFork(begin, middle);
            //拆分右边
            MyFork myFork2 = new MyFork(middle + 1, end);

            //调用方法拆分
            myFork1.fork();
            myFork2.fork();
            //合并结果
            result = myFork1.join() + myFork2.join();
        }
        return result;
    }
}

public class ForkJoinDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建MyFork对象
        MyFork myFork = new MyFork(0,100);
        //创建分支合并池对象
        ForkJoinPool forkJoinPool = new ForkJoinPool();

        ForkJoinTask<Integer> joinTask = forkJoinPool.submit(myFork);
        Integer result = joinTask.get();
        System.out.println("获取最后的结果"+result);
        //关闭池对象
        forkJoinPool.shutdown();

    }
}

举报

相关推荐

0 条评论