標籤:

RecursiveTask 如何使用

RecursiveTask 如何使用

Fork/Join框架是Java7提供了的一個用於並行執行任務的框架, 是一個把大任務分割成若干個小任務,最終匯總每個小任務結果後得到大任務結果的框架。

我們再通過Fork和Join這兩個單詞來理解下Fork/Join框架,Fork就是把一個大任務切分為若干子任務並行的執行,Join就是合併這些子任務的執行結果,最後得到這個大任務的結果。比如計算1+2+。。+10000,可以分割成10個子任務,每個子任務分別對1000個數進行求和,最終匯總這10個子任務的結果

具體的代碼例子

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ForkJoinPool;

import java.util.concurrent.Future;

import java.util.concurrent.RecursiveTask;

@Slf4j

public class ForkJoinTaskExample extends RecursiveTask<Integer> {

public static final int threshold = 2;

private int start;

private int end;

public ForkJoinTaskExample(int start, int end) {

this.start = start;

this.end = end;

}

@Override

protected Integer compute() {

int sum = 0;

//如果任務足夠小就計算任務

boolean canCompute = (end - start) <= threshold;

if (canCompute) {

for (int i = start; i <= end; i++) {

sum += i;

}

} else {

// 如果任務大於閾值,就分裂成兩個子任務計算

int middle = (start + end) / 2;

ForkJoinTaskExample leftTask = new ForkJoinTaskExample(start, middle);

ForkJoinTaskExample rightTask = new ForkJoinTaskExample(middle + 1, end);

// 執行子任務

leftTask.fork();

rightTask.fork();

// 等待任務執行結束合併其結果

int leftResult = leftTask.join();

int rightResult = rightTask.join();

// 合併子任務

sum = leftResult + rightResult;

}

return sum;

}

public static void main(String[] args) {

ForkJoinPool forkjoinPool = new ForkJoinPool();

//生成一個計算任務,計算1+2+3+4

ForkJoinTaskExample task = new ForkJoinTaskExample(1, 100);

//執行一個任務

Future<Integer> result = forkjoinPool.submit(task);

try {

log.info("result:{}", result.get());

} catch (Exception e) {

log.error("exception", e);

}

}

}


推薦閱讀:

2018年印度互聯網的變與不變(GMIC圓桌論壇)
【壹看板&傳智匯】數據驅動新營銷,互聯網營銷新挑戰
聯合一二級市場多家投資機構,白鯨投融資平台正式上線
如何評價今日頭條APP?
信任關係框架:移動互聯網及智能時代的營銷方法論

TAG:移動互聯網 |