今天沒有嘮叨,直接上demo:
使用RecursiveTask實現一個累加的功能,使用分而治之的思想,實現分段求和後彙總返回結果。
對1到100000000進行求和。
注意else循環中不是一分為2,而是遞歸處理的。不明白請看下面日誌輸出:
上面示例是有返回值的使用,當然也可以是沒有返回值的。此時需要用到:RecursiveAction。這裡不再舉例,感興趣的同學下去可以自己寫一個小demo。
附上源碼
/**
* 測試並行任務
*
*
* @author: IT講壇
* @see [相關類/方法](可選)
* @since 1.0.0
**/
public class TestForkPool {
private static ForkJoinPool pool = new ForkJoinPool();
private static class SumTask extends RecursiveTask<long> {
private static final long serialVersionUID = 3828085400692474943L;
private long[] numbers;
private int from;
private int to;
public SumTask(long[] numbers, int from, int to) {
this.numbers = numbers;
this.from = from;
this.to = to;
}
//對任務進行拆分
@Override
protected Long compute() {
// 當需要計算的數字個數小於100時,直接採用for方式計算結果
if (to - from < 100) {
long total = 0;
for (int i = from; i <= to; i++) {
total += numbers[i];
}
return total;
} else {
// 否則,把任務均分,遞歸拆分(注意此處有遞歸)到底拆分成多少份,需要根據具體情況而定
System.out.println("FROM:"+from+"-TO:"+to);
int middle = (from + to) / 2;
SumTask taskLeft = new SumTask(numbers, from, middle);
SumTask taskRight = new SumTask(numbers, middle + 1, to);
taskLeft.fork();
taskRight.fork();
return taskLeft.join() + taskRight.join();
}
}
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
long[] numbers = LongStream.rangeClosed(1, 1000).toArray();
ForkJoinTask<long> submit = pool.submit(new SumTask(numbers, 0, numbers.length-1));
Long aLong = submit.get();
System.out.println("結果:"+aLong);
}
}/<long>/<long>
閱讀更多 IT講壇 的文章