ForkJoinPool也是线程池的一种,从JDK1.7开始才被引入,它可以对任务进行拆分并分配给多个线程执行,最后再把结果整合起来,其原理图如下:
示例代码:
package main.java.learn04;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
public class MyTest3 {
public static void main(String[] args) {
// ForkJoinPool forkJoinPool = new ForkJoinPool();
ForkJoinPool forkJoinPool = new ForkJoinPool(10);
MyTask myTask = new MyTask(1,100);
Integer result = forkJoinPool.invoke(myTask);
System.out.println(result);
forkJoinPool.shutdown();
}
}
class MyTask extends RecursiveTask<Integer> {
private int limit = 4;
private int firstIndex;
private int lastIndex;
public MyTask(int firstIndex, int lastIndex) {
this.firstIndex = firstIndex;
this.lastIndex = lastIndex;
}
@Override
protected Integer compute() {
int result = 0;
int gap = lastIndex - firstIndex;
boolean flag = gap <= limit;
if(flag){
System.out.println(Thread.currentThread().getName());
for(int i = firstIndex;i <= lastIndex;++i){
result += i;
}
}else {
int middleIndex = (firstIndex + lastIndex)/2;
MyTask leftTask = new MyTask(firstIndex,middleIndex);
MyTask rightTask = new MyTask(middleIndex+1,lastIndex);
invokeAll(leftTask,rightTask);
Integer leftTaskResult = leftTask.join();
Integer rightTaskResult = rightTask.join();
result = leftTaskResult + rightTaskResult;
}
return result;
}
}