如果我们需要处理一大批数据,但是没有处理这批数据的能力,就可以使用分而治之的方式.fork/join框架就是对这种方式的体现.
ForkJoinTask 接口的实现类: RecursiveTask 有返回值 RecursiveAction 无返回值
demo:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
public class TestForkJoin{
/**
* ForkJoinTask 接口下的继承类 RecursiveTask 有返回值
* RecursiveAction 无返回值
*
* 计算求和
*/
private static class TaskDemo extends RecursiveTask<Long> { //继承RecursiveTask
private static final int NUM = 10; //数据个数大于10 则使用分而治之 方式
private int start;
private int end;
public TaskDemo(int start, int end){
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
Long sum = 0L;
if((end - start + 1) < NUM){
for(int i = start; i <= end; i++){
sum += i;
}
}else{
int step = (end - start)/10; // 10 子线程数 step 每个子线程处理的数据量
List<TaskDemo> list = new ArrayList<TaskDemo>();
int pos = start;
for(int i = 0; i < 10; i++){
int lastOne = pos + step;
if(lastOne > end){
lastOne = end;
}
TaskDemo taskDemo = new TaskDemo(pos, lastOne);
pos += step + 1;
list.add(taskDemo);
taskDemo.fork(); //生成子线程执行任务
}
for(TaskDemo task : list){
sum += task.join(); //获取子线程返回的结果
}
}
return sum;
}
}
public static void main(String[] args) {
ForkJoinPool forkJoinPool = new ForkJoinPool(); //forkJoinPool 连接池
TaskDemo taskDemo = new TaskDemo(1, 12);
ForkJoinTask<Long> task = forkJoinPool.submit(taskDemo);
Long result = null; //会阻塞 直到子线程都执行完
try {
result = task.get();
System.out.println(result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
forkJoinPool.shutdown();
}
}
结果显示:
78