Fork/Join框架的基本使用

問題

假設(shè)有個(gè)非常大的long[]數(shù)組,通過FJ框架求解數(shù)組所有元素的和。

解決方法

任務(wù)類定義,因?yàn)樾枰祷亟Y(jié)果,所以繼承RecursiveTask,并覆寫compute方法。任務(wù)的fork通過
ForkJoinTask的fork方法執(zhí)行,join方法方法用于等待任務(wù)執(zhí)行后返回:

public class ArraySumTask extends RecursiveTask<Long> {
private final int[] array;
private final int begin;
private final int end;
private static final int THRESHOLD = 100;
public ArraySumTask(int[] array, int begin, int end) {
this.array = array;
this.begin = begin;
this.end = end;
}
@Override
protected Long compute() {
long sum = 0;
if (end - begin + 1 < THRESHOLD) { // 小于閾值, 直接計(jì)算
for (int i = begin; i <= end; i++) {
sum += array[i];
}
} else {
int middle = (end + begin) / 2;
ArraySumTask subtask1 = new ArraySumTask(this.array, begin, middle);
ArraySumTask subtask2 = new ArraySumTask(this.array, middle + 1,
end);
subtask1.fork();
subtask2.fork();
long sum1 = subtask1.join();
long sum2 = subtask2.join();
sum = sum1 + sum2;
}
return sum;

調(diào)用方如下:

public class Main {
public static void main(String[] args) {
ForkJoinPool executor = new ForkJoinPool();
ArraySumTask task = new ArraySumTask(new int[10000], 0, 9999);
ForkJoinTask future = executor.submit(task);
// some time passed...
if (future.isCompletedAbnormally()) {
System.out.println(future.getException());
}
try {
System.out.println("result: " + future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}

注意:ForkJoinTask在執(zhí)行的時(shí)候可能會(huì)拋出異常,但是沒辦法在主線程里直接捕獲異常,所以
ForkJoinTask提供了isCompletedAbnormally() 方法來檢查任務(wù)是否已經(jīng)拋出異常或已經(jīng)被取消了,
并且可以通過ForkJoinTask的getException 方法獲取異常.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容