package ForkJoinPooltest;
import java.util.ArrayList;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
/**
* @author
* @version 1.0.0
* @ProjectName: testend
* @Package: ForkJoinPooltest
* Created on 2018/7/8 19:45
* @Description: CountTask
*/
class CountTask extends RecursiveTask<Long>{
private static final int THRESHOLD= 10000;
private long start ;
private long end;
public CountTask(long start,long end){
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
long sum = 0;
boolean canCompute = ( end- start ) < THRESHOLD;
if(canCompute){
for (long i = start; i <=end ; i++) {
sum += i;
}
}else {
long step = (end - start+1)/100;//分解为100份,每份step个
System.out.println(step);
ArrayList<CountTask> subTasks = new ArrayList<CountTask>();
long pos = start;
for (long i = 0; i <100 ; i++) {
long lastOne = pos + step;
if(lastOne>end){
lastOne = end;
}
CountTask countTask =new CountTask(pos,lastOne);
pos=lastOne+1;
subTasks.add(countTask);
countTask.fork();
}
for (CountTask i: subTasks) {
sum+=i.join();
}
}
return sum;
}
public static void main(String[] args) {
ForkJoinPool forkJoinPool = new ForkJoinPool();
CountTask task = new CountTask(0,200000L);
ForkJoinTask<Long> result = forkJoinPool.submit(task);
try{
long res = result.get();
System.out.println(res);
}catch(Exception e){
e.printStackTrace();
}
}
}
fork-join分支合并完成加法
最新推荐文章于 2025-06-27 16:02:15 发布