摘抄
//使用双端队列 用来 实现 窃取算法,
//1. 继承RecursiveAction/RecursiveTask 实现相应的compute方法
//RecursiveAction:用于无返回结果的任务。实现 void compute()
//RecursiveTask : 有结果。实现<T>compute()
//2. ForkJoinPool 执行任务
//实现 1~1000 的和
public class MyTask extends RecursiveTask<Integer>{
private static final int NUM = 10; //超过两个就分割
private int start;
private int end;
public MyTask(int start,int end){
this.start = start;
this.end = end;
}
protected Integer compute() {
int sum = 0;
if( end - start < NUM)
for(int i =start; i<=end; ++i)
sum += i;
else {
int mid = (start + end)/2;
// 分解任务
MyTask leftTask= new MyTask ();
MyTask rightTask = new MyTask ();
//小任务执行 task.fork()
leftTask.fork();
rightTask .fork();
//拿到子任务结果 task.join()
sum = leftTask.join() + rightTask .join();
}
return sum;
}
public static void main(String[] args) {
//提交任务到ForkJoin框架
new ForkJoinPool().invoke(new MyTask(1,1000));
}
}
本文介绍了一种利用ForkJoinPool和窃取算法实现任务分解与并行计算的方法。通过递归任务划分,将计算大任务分解为小任务,并行执行,最后汇总结果。示例代码展示了如何计算1到1000的和。
1157

被折叠的 条评论
为什么被折叠?



