这两天在做阿里中间件的比赛,在看并发的一些内容, 本文将总结一下自己看的 Java 中 Fork/Join 计算框架。Fork/Join 框架被设计成可以容易地将算法并行化、分治化。在实际情况中,很多时候我们都需要面对经典的 "分治" 问题。要解决这类问题,主要任务通常被分解为多个任务块(分解阶段),其后每一小块任务被独立并行计算。一旦计算任务完成,每一快的结果会被合并或者解决(解决阶段)。
Fork/Join 框架是 Java7 提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。
通过 Fork 和 Join 这两个单词来理解下 Fork/Join 框架,Fork 就是把一个大任务切分为若干子任务并行的执行,Join 就是合并这些子任务的执行结果,最后得到这个大任务的结果。比如计算 1+2+。。+10000,可以分割成 10 个子任务,每个子任务分别对 1000 个数进行求和,最终汇总这 10 个子任务的结果。
有两个主要的方法:
- ForkJoinTask
的异步执行,凭借这个方法可以创建新的任务。
- ForkJoinTask
框架在
- Fork/Join
包中加入了两个主要的类:
- java.util.concurrent
类是 ForkJoinTask 实例的执行者,
- ForkJoinPool
的主要任务就是 "工作窃取",其线程尝试发现和执行其他任务创建的子任务。
- ForkJoinPool
Fork-Join 框架涉及的主要类如下:
Fork/Join 使用两个类来完成上面两步:
fork/join 首先会做一个工作分割的工作。
- if(如果工作量足够小)
- 直接处理else将工作量分割为两部分
- 调用两部分,等待结果返回
- 整合两部分返回结果
分割工作量这部分代码在
子类中实现就可以。可以是
- ForkJoinTask
或者
- RecursiveTask
.
- RecursiveAction
下面实现一个这样的任务:计算 1+2+…+10000 累加任务。
- import java.util.concurrent.ExecutionException;
- import java.util.concurrent.ForkJoinPool;
- import java.util.concurrent.Future;
- import java.util.concurrent.RecursiveTask;public class Main extends RecursiveTask<Integer> {
- private static final intTHRESHOLD =100;private intstart;private intend;publicMain(intstart,intend){this.start = start;this.end = end;
- }protectedInteger compute(){int sum=0;booleancanComputer = (end - start) <= THRESHOLD;//如果任务规模小于 阈值 THRESHOLD 就直接计算
- if(canComputer){for(inti = start; i <= end; i++){sum+= i;
- }
- }else{//如果任务大于阈值就裂变为两个子任务
- intmiddle = (start + end) /2;
- Main leftTask =newMain(start, middle);
- Main rightTask =newMain(middle +1, end);//执行子任务leftTask.fork();
- rightTask.fork();intleftResult = leftTask.join();intrightResult = rightTask.join();//合并子任务
- sum= leftResult + rightResult;
- }return sum;
- }public static voidmain(String[] args){
- ForkJoinPool pool =newForkJoinPool();
- Main task =newMain(1,10000);
- Future result = pool.submit(task);
- try{
- System.out.println("result is:"+ result.get());
- }catch(InterruptedException e){
- }catch(ExecutionException e){
- }finally{
- pool.shutdown();
- }
- }
- }
https://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html http://www.slideshare.net/hongjiang/java7-fork-join-framework-and-closures http://www.importnew.com/2279.html http://www.infoq.com/cn/articles/fork-join-introduction
来源: http://blog.csdn.net/xidiancoder/article/details/72623002