ForkJoin分支合并计算

本文探讨了ForkJoin框架,它是并行计算的一种策略,通过将大任务拆分成小任务并行处理,然后合并结果。ForkJoin框架常用于复杂算法的优化,提高计算效率。

ForkJoin分支合并计算

ForkJoin 常用其子抽象

ForkJoinPool
ForkJoinTask:子类
	RecursiveTask
public abstract class ForkJoinTask<V> implements Future<V>, Serializable 
    //实现了Future就是实现了Callable
public abstract class RecursiveTask<V> extends ForkJoinTask<V> 
/**
 * ForkJoin:
 * ForkJoinPool
 * ForkJoinTask
 * RecursiveTask
 */
public class ForkJoinTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建任务
        MyTask myTask = new MyTask(0L, 100L);
        //使用ForkJoinPool执行
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        //执行
        ForkJoinTask<Long> submit = forkJoinPool.submit(myTask);
        //获取返回值submit.get()
        Long aLong = submit.get();
        System.out.println("aLong = " + aLong);
        // 关闭forkJoinPool
        forkJoinPool.shutdown();

        /**
         * stream形式计算
         */
        OptionalLong reduce = LongStream
                                .rangeClosed(0L, 100L)//计算值rangeClosed包括开始 和结束值
                                .parallel()     //使用并行流计算
                                .reduce(Long::sum);//指定计算类型为求和
        //(x,y)->{return x+y;} <==> Long::sum
        /**
         * reduce:使某一特定事物在数量、程度或大小上变小或变少。
         * 字符串拼接、数值的 sum、min、max、average 都是特殊的 reduce
         */
        System.out.println("reduce = " + reduce.getAsLong());
    }
}
class MyTask extends RecursiveTask<Long>{
    //临界值 超过此值时重复使用递归 将任务无限制分化 小于此值时计算 ,
    // 然后就有无数个小任务计算,再拿到他们的join(结果),相加即可
    public static final Integer ADJUST_VALUE = 10;
    /**
     * 起始值
     */
    private Long begin;
    /**
     * 结束值
     */
    private Long end;
    //返回值
    private Long result = 0L;

    public MyTask(Long begin, Long end) {
        this.begin = begin;
        this.end = end;
    }

    //计算方法
    @Override
    protected Long compute() {
        if ((end-begin)<=ADJUST_VALUE){//计算次数小于10
            for (Long i = begin; i <= end; i++) {
                result += i;
            }
        } else {
            Long middle = (end+begin)/2;//获取两数的中间数
            //第一条线程
            MyTask task1 = new MyTask(begin, middle);
            //第二条线程
            MyTask task2 = new MyTask(middle + 1, end);
            //递归调用本compute()方法
            task1.fork();
            task2.fork();
            //合并分支的结果
            result = task1.join() + task2.join();
        }
        return result;
    }

}
/**
 * 1-100 ->
 *          1-50    51-100 不符合if()继续递归   fork()->
 *              1-25  26-50  51-75  76-100 不符合if()继续递归   fork()->
 *          1-12  13-25  26-38 39-50 51-65  66-75  75-84  85-100
 * ......
 *          然后通过task1.join() + task2.join();合并所有线程结果
 *
 */
aLong = 5050
reduce = 5050
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值