分而治之就是將乙個大任務層層拆分成乙個個的小任務,直到不可拆分,拆分依據定義的閾值劃分任務規模。
fork/join通過fork將大任務拆分成小任務,在將小任務的結果join彙總
先上圖
在使用fork/join做任務分配之前,首先得了解其中的幾個類:
forkjoinpool:充當fork/join框架裡面的管理者,最原始的任務都要交給它才能處理。它負責控制整個fork/join有多少個workerthread,workerthread的建立,啟用都是由它來掌控。它還負責workqueue佇列的建立和分配,每當建立乙個workerthread,它負責分配相應的workqueue。然後它把接到的活都交給workerthread去處理,它可以說是整個frok/join的容器。
forkjoinworkerthread:fork/join裡面真正幹活的"工人",本質是乙個執行緒。裡面有乙個forkjoinpool.workqueue的佇列存放著它要幹的活,接活之前它要向forkjoinpool註冊(registerworker),拿到相應的workqueue。然後就從workqueue裡面拿任務出來處理。它是依附於forkjoinpool而存活,如果forkjoinpool的銷毀了,它也會跟著結束。
forkjoinpool.workqueue: 雙端佇列就是它,它負責儲存接收的任務。
forkjointask:代表fork/join裡面任務型別,我們一般用它的兩個子類recursivetask、recursiveaction。這兩個區別在於recursivetask任務是有返回值,recursiveaction沒有返回值。任務的處理邏輯包括任務的切分都集中在compute()方法裡面。
fork/join在平時的使用過程中,一般分為同步呼叫和非同步呼叫,下面是兩種情況的例項:
/**同步用法*/1 public
class
sumarray
1415
@override
16protected
integer compute()
23return
count;
24 }else33}
34}3536
public
static
void
main(string args)
50 }
/**這段**可以直接執行試試,跟上面的標準正規化一樣,在這裡我是實現了recursivetask(有興趣的可以自己改成recursiveaction玩玩,但是recursiveaction是沒有返回值的,使用的時候需要注意),當呼叫forkjoinpool的invoke方法啟動任務,會同步呼叫重寫的compute方法,這個方法裡面才是你要寫的fork/join業務**。*非同步用法
* *類說明:遍歷指定目錄(含子目錄)找尋指定型別檔案 */
public
class finddirsfiles extends
recursiveaction
public
static
void
main(string args)
system.out.println("main thread done sth......,otherwork="+otherwork);
task.join();
//阻塞的方法
system.out.println("task end");
} catch
(exception e)
}@override
protected
void
compute()
else}}
if(!subtasks.isempty()) }}
}}
可以看到,我定義了乙個閾值threshold,當任務小於這個閾值的時候,執行運算,否則繼續切分任務,提交任務,迴圈呼叫,直到任務不可切分,將所有的運算結果整合。其實我在呼叫invokeall方法時,並不會立刻返回結果,裡面還是會去重複判斷每乙個任務是否小於閾值,當所有的任務都滿足條件並執行完成,才會返回,其實就是遞迴呼叫。
fork/join的使用其實沒什麼難度,其基本思想是將大任務分割成小任務,最後將小任務聚合起來得到結果。fork是分解的意思, join是收集的意思. 它非常類似於hadoop提供的mapreduce框架,只是mapreduce的任務可以針對集群內的所有計算節點,可以充分利用集群的能力完成計算任務。forkjoin更加類似於單機版的mapreduce。
併發程式設計 Fork Join框架
三 jdk中fork join家族成員 3.2 forkjoinpool 四 使用案例 fork join是jdk提供的乙個用於並行執行任務的框架,是乙個把大任務分割成若干個小任務,最終彙總每個小任務結果後得到大任務結果的框架 fork join是乙個比較特殊的執行緒池框架,專用於需要將乙個任務不斷...
併發程式設計(6) forkjoin
forkjion裡面的兩個重要的概念 分而治之,什麼是分而治之?乙個大的事情平均分成幾個相同小的事情,如果沒有達到最小的要求,就繼續分,一直分到達到的要求。工作密取,workstealing 如果分而治之的執行緒很多,就會形成執行緒的佇列,這裡面就會有完成的快和慢的不同執行緒。快的執行緒執行完成以後...
Java併發程式設計指南(五) Fork Join框架
這個框架被設計用來解決可以使用分而治之技術將任務分解成更小的問題。在乙個任務中,檢查你想要解決問題的大小,如果它大於乙個既定的大小,把它分解成更小的任務,然後用這個框架來執行。這個框架基於以下兩種操作 work stealing演算法 當乙個任務正在等待它使用join操作建立的子任務的結 束時,執行...