JUC:11、Fork/Join分支合并框架

本文介绍了Java的Fork/Join框架,用于将大型任务分解为多个子任务并行处理,最后合并结果。示例代码展示了如何利用Fork/Join计算1到100的数字之和,当子任务大小超过10时继续拆分,最终通过RecursiveTask实现任务的递归拆分和合并。

11.1 Fork/Join框架概述

Fork/Join 可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。

Fork/Join一共完成两件事情:

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

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

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

在Fork/Join框架里,使用两个类实现上面的事情。

11.2 代码实现

实现1+2+3+4+...+100。分成多个子任务进行执行,每个子任务相加序列的最小值和最大值不能超过10,否则继续拆分成更小的任务。

package forkjoin;

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

public class ForkJoinDemo1 {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建对象
        MyTask myTask = new MyTask(1, 100);
        //创建分支合并池对象
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask<Integer> submit = forkJoinPool.submit(myTask);
        System.out.println(submit.get());
        forkJoinPool.shutdown();
    }
}

class MyTask extends RecursiveTask<Integer> {

    private int n1;
    private int n2;
    private int result;

    public MyTask(int n1, int n2) {
        this.n1 = n1;
        this.n2 = n2;
    }

    @Override
    protected Integer compute() {
        if(n2 - n1 >= 10) {
            int mid = n1 + (n2 - n1) / 2;
            MyTask task1 = new MyTask(n1, mid);
            MyTask task2 = new MyTask(mid+1, n2);
            task1.fork();
            task2.fork();
            result = task1.join() + task2.join();
        } else {
            for(int i = n1; i <= n2; i++) result += i;
        }
        return result;
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值