/**
* 我们以多线程并发计算数组的和的例子来初步使用Fork/Join框架
* 首先是要将任务类继承子RecursiveTask(有需要返回值得)或RecursiveAction(不需要返回值的)
*/
public class SumTask extends RecursiveTask<Integer> {
private int[] data;
private int start;
private int end;
/**
* 接着我们应该在构造函数里传入此次任务必要的一些参数
* @param data
* @param start
* @param end
*/
public SumTask(int[] data,int start,int end){
this.data = data;
this.start = start;
this.end = end;
}
/**
* 编写执行的任务细节
* 我们将任务分成尽可能小的任务来并发执行
* 当你觉得任务还不够小时,那就继续才分,然后fork线程分发执行,最后join等待执行结果
* 如果任务足够小了,开始写业务逻辑
* @return
*/
@Override
protected Integer compute() {
int sum = 0;
if(end-start<10){
for(int i=start;i<=end;i++){
sum+=data[i];
}
}else{
int mid=(end + start)/2;
SumTask leftTask = new SumTask(data,start,mid);
SumTask rightTask = new SumTask(data,mid+1,end);
invokeAll(leftTask,rightTask);
return leftTask.join()+rightTask.join();
}
return sum;
}
public static void main(String[] args) {
int[] res = {1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10};
int sum = 0;
for(int i=0;i<res.length;i++){
sum+=res[i];
}
System.out.println(sum);
SumTask sumTask = new SumTask(res,0,res.length-1);
ForkJoinPool forkJoinPool=new ForkJoinPool();
forkJoinPool.invoke(sumTask);
int result = sumTask.join();
System.out.println(result);
}
}
fork/join的基本使用
最新推荐文章于 2024-06-11 21:50:02 发布