这就是Fork/Join任务的原理:判断一个任务是否足够小,如果是,直接计算,否则,就分拆成几个小任务分别计算。这个过程可以反复“裂变”成一系列小任务。
我们来看如何使用Fork/Join对大数据进行并行求:
public class SumTask extends RecursiveTask<Integer> {
static final int THRESHOLD = 5;
int start = 0;
int end = 0;
public SumTask(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected Integer compute() {
int sum = 0;
if ((end-start)<=THRESHOLD){
for (int i =start;i<=end;i++){
sum=sum+i;
}
return sum;
}
int mid = (end+start)/2;
SumTask task1 = new SumTask(start,mid);
SumTask task2 = new SumTask(mid+1,end);
invokeAll(task1,task2);
int r1 = task1.join();
int r2 = task2.join();
return r1+r2;
}
public static void main(String[] args) {
ForkJoinTask<Integer> task= new SumTask(0,10);
System.out.println(ForkJoinPool.commonPool().invoke(task));
System.out.println(task);
Long sum = LongStream.rangeClosed(0L, 3L).parallel().reduce(0, Long::sum);
reduce的第一个初始值如过按照并行流parallel计算的话,会根据计算机的核数每次都多加一个初始值
}
网友评论