三、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的思路也是同理,只不過劃分之後的任務更適合分派給不同的計算資源,可以並行的完...