package com.interview.thread;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
public class ForkJoinTest {
public static void main(String[] args) {
CalcTask task = new CalcTask(1,1000000000L);
ForkJoinPool pool = new ForkJoinPool();
Long result = pool.invoke(task);
System.out.println(result);
}
}
//使用fork/join並行計算累加任務
class CalcTask extends RecursiveTask<Long>{
private static final long serialVersionUID = 1L;
private long start;
private long end;
public CalcTask(long start, long end) {
super();
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
if((end-start) <= 10) {//不大於閾值,直接計算,不使用框架
long sum = 0;
for(long i=start;i<=end;i++) {
sum+=i;
}
return sum;
}else{//使用框架
long mid = (start+end)/2;
//拆分子任務
CalcTask c1 = new CalcTask(start, mid);
c1.fork();
//拆分子任務
CalcTask c2 = new CalcTask(mid+1, end);
c2.fork();
//合併
return c1.join() + c2.join();
}
}
}