JDK1.7提供了Fork/Join方式的大任务分解成小任务执行的API。
下面是一个简单实例:
计算1到1000的累加和,要求两两相加,再把各自的结果再次两两相加直到得出最后一个结果。也就是把累加的任务分成许多个两个数相加的小任务,然后再合并这些任务的计算结果。
package thread.test3;
import java.util.concurrent.RecursiveTask;
public class CountTask extends RecursiveTask<Integer>
{
private static final long serialVersionUID = 1L;
private int start,end;
private int taskSize = 2;
public CountTask(int start,int end)
{
this.start = start;
this.end = end;
}
/**
* 每个任务执行的工作
*/
@Override
protected Integer compute() {
int sum = 0;
boolean canCompute = (end - start) <= taskSize;
if(canCompute)//判断当前任务是否可以继续划分,如果不能继续划分,则开始运算
{
for(int i = start;i<= end;i++)
{
sum = sum + i;
}
}
else {
/**
* 划分为两个任务
*/
int middle = (start + end) / 2;
CountTask task1 = new CountTask(start, middle);
CountTask task2 = new CountTask(middle + 1, end);
task1.fork();//开始执行
task2.fork();//开始执行
//获得一个子任务的结果,如果得不到结果,此线程就不会往下继续执行
int task1Result = task1.join();
int task2Result = task2.join();
sum = task1Result + task2Result;//合并子任务的结果
}
return sum;
}
}
主函数:
package thread.test3;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
public class Test {
public static void main(String[] args) throws Exception, ExecutionException {
ForkJoinPool forkJoinPool = new ForkJoinPool();//线程池
CountTask task = new CountTask(1, 1000);
Future<Integer> result = forkJoinPool.submit(task);
System.out.println("1 - 1000的累加结果是:"+result.get());
System.out.println("主线程结束...");
}
}
运行结果:
1 - 1000的累加结果是:5050
主线程结束...