併發程式設計 Fork Join框架

2021-10-21 07:20:04 字數 1907 閱讀 5609

三、jdk中fork/join家族成員

3.2 forkjoinpool

四、使用案例

fork/join是jdk提供的乙個用於並行執行任務的框架,是乙個把大任務分割成若干個小任務,最終彙總每個小任務結果後得到大任務結果的框架

fork/join是乙個比較特殊的執行緒池框架,專用於需要將乙個任務不斷分解成子任務,再不斷彙總得到最終結果的計算過程,比起傳統的執行緒池類threadpoolexecutor,forkjoinpool實現了工作竊取演算法,使得空閒執行緒可以主動分擔從別的執行緒分解出來的子任務,從而讓所有的執行緒都盡可能的處於飽滿的工作狀態,並因此提高了工作效率

指某個執行緒從其他佇列裡竊取任務來執行,執行流程如下圖所示:

實現了future介面,但是比future多了兩個重要的方法

繼承forkjointask,用於沒有返回結果的任務

繼承forkjointask,用於有返回結果的任務

實現executor介面,提供了三個方法用來排程任務

public

class

sumdemo

@override

protected long compute()

return sum;

}int mid =

(startindex + endindex)

>>1;

sumtask leftsumtask =

newsumtask

(arr, startindex, mid)

; sumtask rightsumtask =

newsumtask

(arr, mid +

1, endindex)

;invokeall

(leftsumtask, rightsumtask)

;return leftsumtask.

join()

+ rightsumtask.

join()

;}}@test

public

void

test()

forkjoinpool forkjoinpool =

newforkjoinpool()

; sumtask sumtask =

newsumtask

(arr,

0, num -1)

;long start = system.

currenttimemillis()

; forkjoinpool.

invoke

(sumtask)

;long rt = sumtask.

join()

;long end = system.

currenttimemillis()

; system.out.

println

("計算結果為:"

+ rt +

",花費時間為:"

+(end - start)

+"ms");

}}

public

class

findtxtfiles

@override

protected

void

compute()

else}}

}if(!subtasks.

isempty()

)}}}

@test

public

void

test()

throws interruptedexception

}

併發程式設計(6) forkjoin

forkjion裡面的兩個重要的概念 分而治之,什麼是分而治之?乙個大的事情平均分成幾個相同小的事情,如果沒有達到最小的要求,就繼續分,一直分到達到的要求。工作密取,workstealing 如果分而治之的執行緒很多,就會形成執行緒的佇列,這裡面就會有完成的快和慢的不同執行緒。快的執行緒執行完成以後...

併發程式設計之fork join 分而治之

分而治之就是將乙個大任務層層拆分成乙個個的小任務,直到不可拆分,拆分依據定義的閾值劃分任務規模。fork join通過fork將大任務拆分成小任務,在將小任務的結果join彙總 先上圖 在使用fork join做任務分配之前,首先得了解其中的幾個類 forkjoinpool 充當fork join框...

forkjoin併發框架 需求背景和設計原理

看過 introduction to algorithms 演算法導論 的朋友們應該還記得,在講到歸併排序 merge sort 和快速排序的時候,有一種很簡單又很有效率的思路就是 分而治之 即 分治法 而fork join的思路也是同理,只不過劃分之後的任務更適合分派給不同的計算資源,可以並行的完...