JAVA使用ForkJoinPool实现子任务拆分进行数值累加代码示例

 

 

SumTask.java

import java.util.concurrent.RecursiveTask;

/**
 * 定义任务和拆分逻辑
 * RecursiveTask<Long> 这个是 有返回值的
 * 如果不需要返回值可以用 RecursiveAction
 */
public class SumTask extends RecursiveTask<Long> {

    /**
     * 累加的开始值
     */
    private int begin;

    /**
     * 累加的结束值
     */
    private int end;


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

    @Override
    protected Long compute() {
        long sum = 0;

        if (end - begin < 100) {
            //如果两个数值小于100,就不要继续拆分了 直接相加就行
            for (int i = begin; i <= end; i++) {
                sum += i;
            }
            return sum;

        } else {
            //如果大于100继续拆分 取中间数拆分
            int middle = (begin + end) / 2;

            SumTask sumTask1 = new SumTask(begin, middle);
            SumTask sumTask2 = new SumTask(middle + 1, end);

            //分别执行子任务
            sumTask1.fork();
            sumTask2.fork();

            //取出子任务执行的结果
            Long sum1 = sumTask1.join();
            Long sum2 = sumTask2.join();

            //相加
            return sum1 + sum2;

        }

    }
}

 

 

使用

 public static void main(String[] args)  {
        ForkJoinPool pool=new ForkJoinPool(4);

        SumTask sumTask=new SumTask(1,10000);

        //直接获取值
        Long sum = pool.invoke(sumTask);
        System.out.println(sum);


        ForkJoinTask<Long> task = pool.submit(sumTask);
        if (task.isCompletedAbnormally()) {
            //发生异常 打印
            System.out.println(task.getException());
        }
    }

 

posted @ 2024-06-02 16:50  yvioo  阅读(8)  评论(0编辑  收藏  举报