为了偷个懒,我就直接将我自己写程序的注释拿过来贴上去了。
/**
* @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<Integer>{
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<Integer> 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