摘要:框架框架簡介框架是提供的一個用于并行執行任務的框架,是一個把大任務分割成若干個小任務,最終匯總每個小任務結果得到大任務結果的框架。框架實例需求計算的結果。
Fork/Join框架 1. Fork/Join框架簡介
Fork/Join框架是java7提供的一個用于并行執行任務的框架,是一個把大任務分割成若干個小任務,最終匯總每個小任務結果得到大任務結果的框架。Fork指的就是把一個大任務分割成若干子任務并行的執行,Join就是合并這些子任務的執行結果,最后得到這個大任務的結果。
比如計算1+2+3+4+5+……+10000,可以分割成10個子任務,每個子任務負責分別對1000個數進行求和,最終匯總這10個子任務的結果。
2. Fork/Join框架使用說明使用Fork/Join框架我們需要兩個類:
ForkJoinTask:Fork/Join任務,提供fork()和Join()方法,通常情況下繼承它的兩個子類:
RecursiveAction:返回沒有結果的任務。
RecursiveTask:返回有結果的任務。
ForkJoinPool:ForkJoinTask需要通過ForkJoinPool來執行。
從ForkJoinTask的兩個子類的名字中就可以看到,這是一種采用遞歸方式實現的任務分割,任務分割的子任務會添加到當前工作線程所維護的雙端隊列中,進入隊列的頭部,當一個工作線程的隊列里面暫時沒有任務時,它會隨機從其他工作線程隊列的尾部獲取一個任務去執行。
3. Fork/Join框架實例 3.1 需求:計算1 + 2 + 3 +……+10 的結果。
3.2 需求分析設計:使用Fork/Join框架首先要考慮的就是如何分割任務,和分割任務的粒度,這里我們考慮每個子任務最多執行兩個數相加,那我們分割的閾值就是2,Fork/Join框架會把這個任務fork成5個子任務,然后再join5個子任務的結果。因為是有結果的任務,所以必須繼承RecursiveTask。
3.3 代碼實例package com.wangjun.thread; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.Future; import java.util.concurrent.RecursiveTask; public class ForkJoinTaskTest extends RecursiveTask{ private static final int THRESHOLD = 2; // 閾值 private int start; private int end; public ForkJoinTaskTest(int start, int end) { this.start = start; this.end = end; } @Override protected Integer compute() { int sum = 0; if(end - start < THRESHOLD) { System.out.println(Thread.currentThread().getName() + ":" + start + "-" + end); for(int i = start; i <= end; i++) { sum += i; } }else { // 任務大于閾值,拆分子任務 int middle = start + (end - start)/2; ForkJoinTaskTest task1 = new ForkJoinTaskTest(start, middle); ForkJoinTaskTest task2 = new ForkJoinTaskTest(middle + 1, end); // 執行子任務 task1.fork(); task2.fork(); // 等待子任務執行完成,并得到其結果 int result1 = task1.join(); int result2 = task2.join(); // 合并子任務 sum = result1 + result2; } return sum; } public static void main(String[] args) throws InterruptedException, ExecutionException { int start = 1; int end = 10; ForkJoinTaskTest task = new ForkJoinTaskTest(start, end); // 用來執行ForkJoinTask ForkJoinPool pool = new ForkJoinPool(); // 執行任務 Future result = pool.submit(task); System.out.println("最后的結果為:" + result.get()); } }
運行結果:
ForkJoinPool-1-worker-2:3-3 ForkJoinPool-1-worker-0:4-5 ForkJoinPool-1-worker-3:6-7 ForkJoinPool-1-worker-1:1-2 ForkJoinPool-1-worker-3:8-8 ForkJoinPool-1-worker-0:9-10 最后的結果為:55
可以看到ForkJoinTask與一般的任務在于它需要實現compute()方法,在這個方法里面首先需要判斷是否需要分割子任務,如果需要分割,每個子任務再調用fork方法時,就會進入compute()方法,如果不需要分割,則執行當前任務并返回結果,使用join方法會等待子任務結果的返回。可以看到這是一種遞歸的實現。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69619.html
摘要:第二步執行任務并合并結果。使用兩個類來完成以上兩件事情我們要使用框架,必須首先創建一個任務。用于有返回結果的任務。如果任務順利執行完成了,則設置任務狀態為,如果出現異常,則紀錄異常,并將任務狀態設置為。 1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一個用于并行執行任務的框架, 是一個把大任務分割成若干個小任務,最終匯總每個小任務結果后得到大任務結果的...
摘要:對于任務的分割,要求各個子任務之間相互獨立,能夠并行獨立地執行任務,互相之間不影響。是叉子分叉的意思,即將大任務分解成并行的小任務,是連接結合的意思,即將所有并行的小任務的執行結果匯總起來。使用方法會阻塞并等待子任務執行完并得到其結果。 Fork/Join是什么? Fork/Join框架是Java7提供的并行執行任務框架,思想是將大任務分解成小任務,然后小任務又可以繼續分解,然后每個小...
摘要:同時,它會通過的方法將自己注冊到線程池中。線程池中的每個工作線程都有一個自己的任務隊列,工作線程優先處理自身隊列中的任務或順序,由線程池構造時的參數決定,自身隊列為空時,以的順序隨機竊取其它隊列中的任務。 showImg(https://segmentfault.com/img/bVbizJb?w=1802&h=762); 本文首發于一世流云的專欄:https://segmentfau...
摘要:為了減少竊取線程和別竊取線程之間的競爭我們通常使用雙端隊列。被竊取線程永遠從雙端隊列的頭部獲取任務,竊取線程永遠從雙端隊列的尾部獲取內容。優點就是充分利用線程進行并行計算,減少線程間的競爭。使用操作的線程不能執行操作。 Fork-Join框架 Fork和Join是java 1.7提供的用于定型執行的框架,將大任務切分成若干個小任務執行,小任務執行結果匯總成大任務的框架。從字面上理解就是...
摘要:并不會為每個任務都創建工作線程,而是根據實際情況構造線程池時的參數確定是喚醒已有空閑工作線程,還是新建工作線程。 showImg(https://segmentfault.com/img/bVbiYSP?w=1071&h=707); 本文首發于一世流云的專欄:https://segmentfault.com/blog... 一、引言 前一章——Fork/Join框架(1) 原理,我們...
閱讀 2708·2023-04-25 14:59
閱讀 902·2021-11-22 11:59
閱讀 644·2021-11-17 09:33
閱讀 2473·2021-09-27 13:34
閱讀 3904·2021-09-09 11:55
閱讀 2326·2019-08-30 15:44
閱讀 1132·2019-08-30 14:06
閱讀 1931·2019-08-29 16:55