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

2021-07-11 19:36:20 字數 908 閱讀 7854

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

當計算分別完成之後,最後再合併回來。

簡單來看,就是乙個遞迴的分解和合併,直到任務小到可以接受的程度。

fork join設計出來就是為了提高任務完成的效率,圍繞這個目標,有一些要點是設計中需要考慮的,下面就給出一些要點。

執行緒的管理和執行緒的單純性。基於如上的設計思路,我們可以看到子任務之間的相關性是相對比較簡單的,可以並行處理。為了提高效率,並不需要重量級的執行緒結構和對應的執行緒維護,執行緒實現簡單就好,滿足需求即可,降低維護成本。

佇列機制,硬體支援一定是比較有限的,那麼分解的任務應該用佇列維護起來,乙個好的佇列設計是很有必要的。

工作竊取」,也就是設計**原文中提到的 work stealing 。對於負載比較輕的執行緒,可以幫助負載較重的執行執行緒分擔任務。

對於使用fork join的開發者來講,需要注意:

可用執行緒數和硬體支援。執行緒這東西,也是有開銷的東西,絕對不是越多越好,尤其在硬體基礎有限的情況下。

任務分解的粒度。和前者有關係,就是分解的任務,「小」到什麼程度是可以接受的,不可再分。

按照如上設計,分解執行乙個大的任務,fork join至少需要考慮如下一些資料結構。

併發程式設計 Fork Join框架

三 jdk中fork join家族成員 3.2 forkjoinpool 四 使用案例 fork join是jdk提供的乙個用於並行執行任務的框架,是乙個把大任務分割成若干個小任務,最終彙總每個小任務結果後得到大任務結果的框架 fork join是乙個比較特殊的執行緒池框架,專用於需要將乙個任務不斷...

併發程式設計(6) forkjoin

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

8 併發工具類Fork Join

一 概念 fork join 體現 分而治之 思想 將乙個大任務分成n個子執行緒去處理,處理完成後將結果join合併 乙個大任務分成2個執行緒ab執行,每個執行緒執行5個任務,當執行緒a執行完後,發現執行緒b的任務沒執行完,那麼執行緒a會去獲取b的任務執行完並把結果返回到b中,這個情況叫竊取,提高的...