目录
1.简介
Fork/Join是一种并行任务框架,它的核心思想是,将大任务划分为若干小任务并行执行(Fork),然后把结果汇总(Join),类似于MapReduce。它的运行流程如下图所示:
Java 7开始提供了Fork/Join框架,常用的是ForkJoinPool类,它是一个任务池,实际执行任务的是ForkJoinTask及其三个抽象子类CountedCompleter、RecursiveAction、RecursiveTask,通过ForkJoinPool的submit方法提交任务,或者execute方法异步执行任务。在任务的compute方法中,可以调用invoke或invokeAll进行任务分解。
从上面的图中可以看出来,fork会导致任务数量快速增加,如果fork过多,就会对计算机性能造成影响,因此必须提前估计任务规模,合理设计fork次数。
2.RecursiveAction的使用
首先看一个例子,使用ForkJoin进行快排:
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
public class ForkJoinTest {
static class MyAction extends RecursiveAction {
int[] arr;
int start,end;
public MyAction(int[] arr, int start, int end) {
this.arr = arr;
this.start = start;
this.end = end;
}
@Override
protected void compute() {
if(start<end){
int index=partition(arr,start,end);
invokeAll(new MyAction(arr,start,index-1),new MyAction(arr,index+1,end));
}
}
private int partition(int[] arr, int start, int end) {
int pivot = start;
int index = start+1;
for(int i=index;i<=end;i++){
if(arr[i]<arr[pivot]){
swap(arr,i,index);
index++;
}
}
swap(arr,index-1,pivot);
return index-1;
}
private void swap(int[] arr, int i, int j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
public static void main(String args[]) throws InterruptedException {
ForkJoinPool pool = new Fork