JDK1.7提供了Fork/Join方式的大任务分解成小任务执行的API。
下面是一个简单实例:
计算1到1000的累加和,要求两两相加,再把各自的结果再次两两相加直到得出最后一个结果。也就是把累加的任务分成许多个两个数相加的小任务,然后再合并这些任务的计算结果。
package thread.test3;import java.util.concurrent.RecursiveTask;public class CountTask extends RecursiveTask{ 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); Futureresult = forkJoinPool.submit(task); System.out.println("1 - 1000的累加结果是:"+result.get()); System.out.println("主线程结束..."); }}
运行结果:
1 - 1000的累加结果是:5050
主线程结束...