Fork/Join框架简单介绍与使用

为了偷个懒,我就直接将我自己写程序的注释拿过来贴上去了。

/**
 * @author 
 * Fork/join框架是Java7提供的一个用于并行任务执行的框架,将一个大任务分解为若干个小任务,再汇总每个小任务
 * 通常我们使用fork/join框架,需先创建一个任务,这里涉及的类是:ForkJoinTask,但实际我们都采用继承该类的子类来
 * 实现创建任务这个功能。
 * 该框架提供的子类:
 * ①RecursiveAction  用于没有返回结果的任务
 * ②RecursiveTask    用于有返回结果的任务
 * 当然这些子任务必须由ForkJionPool来执行,这个框架池由ForkJoinTask数组和ForkJoinWorkerThread数组
 * 组成,ForkJoinTask负责将存放程序交给框架池,ForkJoinWorkerThread则负责执行这些任务
 * 当我们调用ForkJoinTask的fork方法时,程序会将任务放在ForkJoinWorkerThread的pushTask的workQueue
 * 中,异步地执行这个任务,然后立即返回结果。
 * 
 *直接上个例子,需求是:1+2+3+4+5+6+7+8+9+10的结果
 *使用每个任务的首先要考虑的是如何分割,分割成几个任务,上述例子我们希望每个子任务最多两个数相加,那么我们设置的阈值
 *应该就是2,由于是4个数相加,所以ForkJoin框架会把这个大任务fork成两个子任务,最后再将结果join
 *
 *首先明确因为是有结果的任务,所以必须继承RecursiveTask
 *
 *另外我在网上看到有人这样解释Fork/Join框架:Fork/Join是Java7原生的多线程并行处理框架,类似hadoop提供的
 *mapreduce框架,只是mapreduce的任务可以针对集群内的所有计算节点,可以充分利用集群的能力完成计算任务。
 *Fork/Join框架更加类似于单机版的MapReduce(这里提到下AKKA基于Actor模型的框架,大家有时间可以了解下)。
 *Fork/Join针对具有明显可以进行任务分割特性需求的实现。
 *
 *Fork/Join框架使用了工作窃取的思想(work-stealing)算法从其他队列中窃取任务来执行。通过递归把问题划分为子任务
 *然后并行执行这些子任务,等所有的子任务都结束的时候再合并这种方式来支持并行计算。
 *
 */


public class CountTask extends RecursiveTask{

    private int start;
    private int end;
    private static final int THREAD_HOLD = 5;
    
    public CountTask(int start,int end){
        this.start = start;
        this.end = end;
    }

    @Override
    protected Integer compute() {
        int sum = 0;
        boolean canCompute = (end -start) <= THREAD_HOLD;
        if(canCompute){
            for(int i=start; i<=end; i++){
                sum += i;
            }
        }
        else{
            int middle = (start +end)/2;
            CountTask left = new CountTask(start,middle);
            CountTask right = new CountTask(middle+1,end);
            
            //执行子任务
            left.fork();
            right.fork();
            //获取子任务的结果
            int lResult = left.join();
            int rResule = right.join();
            
            sum = lResult + rResule;
        }
        return sum;
    }
    
//测试程序入口
    public static void main(String[] args){
        ForkJoinPool pool = new ForkJoinPool();
        CountTask task = new CountTask(1,10);
        Future result = pool.submit(task);
    //    System.out.printf("线程池",pool.getActiveThreadCount());
        try{
            System.out.println(result.get());
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    
}


该例子导入的类都是java.util.concurrent 这个包下的。

另外推荐一个更全的介绍该框架的博客地址,个人觉得推荐的地址博客写得算是目前最全的。ifeve.com/talk-concurrency-forkjoin/  网上好的文章还是要积极去推荐的。O(∩_∩)O

你可能感兴趣的:(Java线程)