前言
什么是Fork/Join框架?
Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。Fork/Join框架要完成两件事情:
1.任务分割:首先Fork/Join框架需要把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进行继续分割
2.执行任务并合并结果:分割的子任务分别放到双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行完的结果都放在另外一个队列里,启动一个线程从队列里取数据,然后合并这些数据。
采用的分治思想
例子
从0加到100,当两个数差值不大于10时进行累加
package com.juc;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
/**
* @author niuben
*/
class MyTask extends RecursiveTask<Integer>{
//拆分差值不超过10
private static final Integer VALUE = 10;
private int begin; //拆分开始值
private int end; //拆分结束值
private int result; //结果
//有参构造
public MyTask(int begin,int end){
this.begin = begin;
this.end = end;
}
//拆分和合并的过程
@Override
protected Integer compute() {
//判断差值是否大于10,大于10继续拆,小于10就进行累加
if((end - begin) <= VALUE){
//相加操作
for (int i = begin; i <= end; i++){
result = result + i;
}
}else{ //继续拆分
//获取中间值
int middle = (begin+end)/2;
//拆左边
MyTask task01 = new MyTask(begin,middle);
//拆右边
MyTask task02 = new MyTask(middle+1,end);
//调用拆分方法
task01.fork();
task02.fork();
//合并结果
result = task01.join()+task02.join();
}
return result;
}
}
public class forkjoin {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyTask myTask = new MyTask(0,100);
//创建分支合并的对象
ForkJoinPool forkJoinPool = new ForkJoinPool();
ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask);
//获取结果
Integer result = forkJoinTask.get();
System.out.println("结果为:"+result);
//关闭池对象
forkJoinPool.shutdown();
}
}
运行效果