forkjoin框架最基本的介绍
package com.lyzx.concurrent.threadPool;
import java.util.concurrent.*;
/**
* 分支合并线程池(mapReduce 类似的设计思想)。适合用于处理复杂任务。
* 初始化线程容量与 CPU 核心数相关。
* 线程池中运行的内容必须是 ForkJoinTask 的子类型(RecursiveTask,RecursiveAction)。
* ForkJoinPool - 分支合并线程池。 可以递归完成复杂任务。 要求可分支合并的任务必须
* 是 ForkJoinTask 类型的子类型。 其中提供了分支和合并的能力。 ForkJoinTask 类型提供了两个
* 抽象子类型, RecursiveTask 有返回结果的分支合并任务,RecursiveAction 无返回结果的分支合并任务。(
* Callable/Runnable) compute 方法:就是任务的执行逻辑。
* ForkJoinPool 没有所谓的容量。默认都是 1 个线程。根据任务自动的分支新的子线程。
* 当子线程任务结束后,自动合并。 所谓自动是根据 fork 和 join 两个方法实现的。
* 应用: 主要是做科学计算或天文计算的。 数据分析的。
*/
public class ForkJoinPoolTest{
public static void main(String[] args) throws ExecutionException, InterruptedException {
long[] arr = new long[20000];
for(int i=0;i<arr.length;i++){
arr[i]=i;
}
ForkJoinPool pool = new ForkJoinPool();
JoinTask task = new JoinTask(arr,0,arr.length,50);
Future<Long> future = pool.submit(task);
System.out.println(future.get());
}
}
class JoinTask extends RecursiveTask<Long>{
private int start,end;
private long[] arr;
private int target;
public JoinTask(long[] arr,int start,int end,int target){
this.arr = arr;
this.start = start;
this.end = end;
this.target = target;
}
@Override
protected Long compute() {
/**
* 如果分配的数组大小达到了指定的大小就执行相加的操作
* 否则就继续拆分
*/
if(end - start <= target){
Long result = 0L;
for(int i=start;i<end;i++){
result+= arr[i];
}
return result;
}else{
int mid = start + (end - start)/2;
JoinTask j1 = new JoinTask(arr,start,mid,target);
JoinTask j2 = new JoinTask(arr,mid,end,target);
//fork()方法时继续查分即会继续调用compute方法
j1.fork();
j2.fork();
return j1.join()+j2.join();
}
}
}