RecursiveTask 如何使用
08-03
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;@Slf4jpublic 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+4ForkJoinTaskExample task = new ForkJoinTaskExample(1, 100);//執行一個任務
Future<Integer> result = forkjoinPool.submit(task); try { http://log.info("result:{}", result.get()); } catch (Exception e) { log.error("exception", e); } }}推薦閱讀:
※2018年印度互聯網的變與不變(GMIC圓桌論壇)
※【壹看板&傳智匯】數據驅動新營銷,互聯網營銷新挑戰
※聯合一二級市場多家投資機構,白鯨投融資平台正式上線
※如何評價今日頭條APP?
※信任關係框架:移動互聯網及智能時代的營銷方法論
TAG:移動互聯網 |