ForkJoin框架用于并行执行任务的框架,是把一个大的任务分割成若干个小的任务,最终汇总每个小的任务结果后得到大任务结果的框架。
从上面的描述来看,ForkJoin主要有2个部分需要解决:
1. 任务的分割和任务结果的汇总
2. 每个小任务的执行;
针对上面的2点,ForkJoin提供了下面的类来分别处理。
分割任务和结果的汇总
首先要创建一个ForkJoin任务,提供任务的分割,提交和结果的获取。
具体的类如下图:
很多时候,我们只是需要继承2个子类:RecursiveAction 或者 RecursiveTask就行。区别见图中关系。例如:public class MyTask extends RecursiveTask<Integer>
.
在MyTask类中,必须复写compute函数,在compute函数里面给出下面的内容;
1. 任务的划分
2. 子任务的执行; 例如: MyTask child = new MyTask(); child.fork();
3. 等待子任务的执行并返回结果; 例如: child.join( );
4. 合并子任务的结果; 例如 return child1+child2
任务的执行
ForkJoinPool 用来对子任务的执行。ForkJoinPool是由 ForkJoinTask 和 ForkJoinWorkerThread组成,具体的实现细节后面会讲到。现在先说明下这个类的使用:
......
ForkJoinPool fjp = new ForkJoinPool();
MyTask task = new myTask();
Future<Integer> result = fjp.submit(task); //这个过程很像线程池的使用。
ForkJoin框架的实现细节
下面主要按照图来说明,感觉文字描述比较慢而且不直观。
ForkJoinTask之fork方法
ForkJoinTask之join方法
在join方法中,会根据doJoin( )方法返回的状态进行不同的处理。
以上就是整个ForkJoin框架的大体思路,对于一些详细的细节,如doJoin()内部的实现暂时没有给出详细的思想。以后如果有需要再补充。