java8之ForkJoin框架的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lyzx_in_csdn/article/details/81585324
forkjoin框架
标题

forkjoin框架最基本的介绍

package com.lyzx.concurrent.threadPool;

import java.util.concurrent.*;

/**
 * 分支合并线程池(mapReduce 类似的设计思想)。适合用于处理复杂任务。
 * 初始化线程容量与 CPU 核心数相关。
 * 线程池中运行的内容必须是 ForkJoinTask 的子类型(RecursiveTask,RecursiveAction)。
 * ForkJoinPool - 分支合并线程池。 可以递归完成复杂任务。 要求可分支合并的任务必须
 * 是 ForkJoinTask 类型的子类型。 其中提供了分支和合并的能力。 ForkJoinTask 类型提供了两个
 * 抽象子类型, RecursiveTask 有返回结果的分支合并任务,RecursiveAction 无返回结果的分支合并任务。(
 * Callable/Runnable) compute 方法:就是任务的执行逻辑。
 * ForkJoinPool 没有所谓的容量。默认都是 1 个线程。根据任务自动的分支新的子线程。
 * 当子线程任务结束后,自动合并。 所谓自动是根据 fork 和 join 两个方法实现的。
 * 应用: 主要是做科学计算或天文计算的。 数据分析的。
 */
public class ForkJoinPoolTest{
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        long[] arr = new long[20000];
        for(int i=0;i<arr.length;i++){
            arr[i]=i;
        }

        ForkJoinPool pool = new ForkJoinPool();
        JoinTask task = new JoinTask(arr,0,arr.length,50);
        Future<Long> future = pool.submit(task);
        System.out.println(future.get());
    }
}

class JoinTask extends RecursiveTask<Long>{
    private int start,end;
    private long[] arr;
    private int target;

    public JoinTask(long[] arr,int start,int end,int target){
        this.arr = arr;
        this.start = start;
        this.end = end;
        this.target = target;
    }

    @Override
    protected Long compute() {
        /**
         * 如果分配的数组大小达到了指定的大小就执行相加的操作
         * 否则就继续拆分
         */
        if(end - start <= target){
            Long result = 0L;
            for(int i=start;i<end;i++){
                result+= arr[i];
            }
            return result;
        }else{
            int mid = start + (end - start)/2;
            JoinTask j1 = new JoinTask(arr,start,mid,target);
            JoinTask j2 = new JoinTask(arr,mid,end,target);
            //fork()方法时继续查分即会继续调用compute方法
            j1.fork();
            j2.fork();
            return j1.join()+j2.join();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/lyzx_in_csdn/article/details/81585324