多線程中“分而治之,遞歸計算”,你最好使用ForkJoinPool

今天沒有嘮叨,直接上demo:

使用RecursiveTask實現一個累加的功能,使用分而治之的思想,實現分段求和後彙總返回結果。

對1到100000000進行求和。

多線程中“分而治之,遞歸計算”,你最好使用ForkJoinPool

多線程中“分而治之,遞歸計算”,你最好使用ForkJoinPool

注意else循環中不是一分為2,而是遞歸處理的。不明白請看下面日誌輸出:

多線程中“分而治之,遞歸計算”,你最好使用ForkJoinPool

上面示例是有返回值的使用,當然也可以是沒有返回值的。此時需要用到: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>


分享到:


相關文章: