Java併發程式設計之阻塞佇列與Fork Join框架

2021-09-07 03:07:02 字數 1948 閱讀 8833

阻塞佇列是支援兩個附加操作的佇列。這兩個附加操作支援阻塞插入和移除方法:

阻塞佇列通常用於生產者-消費者場景。生產者是向佇列新增元素的執行緒,使用者是將元素從佇列中取出的執行緒,阻塞佇列是儲存和檢索元素的容器。

阻塞佇列的4種處理方式:

丟擲異常:

返回特殊值:

一直阻塞:

超時退出

arrayblockingqueue

陣列阻塞佇列是乙個使用陣列實現的有界佇列,陣列根據fifo原則對元素進行排序。它還支援將生產者執行緒和使用者執行緒排隊的可選公平性策略,這不保證預設情況下對執行緒的公平訪問,並且可以公平地構造。公平減少了吞吐量,但減少了可變性,並避免了「不平衡」。

linkedblockingqueue

這是乙個使用鍊錶實現的有界阻塞佇列。預設長度和最大長度為整數。最大值。佇列還根據fifo原則對元素進行排序,以確定執行緒執行的順序。

priorityblockingqueue

這是乙個支援優先順序的無邊界的zusu佇列。預設情況下,採用自然公升序,也可以通過建構函式指定comparator對元素進行排序。但它不能保證相同優先元素的順序。

底層是採用二叉最大堆來實現優先順序排序的。

delayqueue

這是乙個支援延遲獲取元素的無邊界阻塞佇列,其佇列使用優先順序佇列priorityqueue實現。佇列中的元素必須實現延遲的介面。建立元素時,可以指定從佇列中檢索元素所需的時間,並且只能在元素過期時指定。

主要用於快取,例如清除緩衝區中超時的資料。它還用於排程定時任務。

建立元素時,首先初始化延遲的介面;然後實現getdelay(timeunit unit)方法,返回的值是當前元素需要延遲多長時間;最後實現compareto(delayed other)方法以指定元素的順序。

當使用者從佇列中檢索元素時,如果元素未達到延遲時間,則當前執行緒將被阻塞。此外,leader變數被設定為表示等待獲取佇列頭元素的執行緒。如果前導不為空,則表示已經準備好等待獲取佇列頭元素,並且使用wait()方法使當前執行緒等待訊號。如果leader為空,則將當前執行緒設定為leader,並使用waitnanos()方法使當前執行緒等待接收到的訊號或延遲時間。

synchronousqueue

與其他阻塞佇列不同,這是乙個不儲存元素的阻塞佇列。每個put操作必須等待take操作,否則不能繼續新增元素,反之亦然。它分為公平訪問佇列和不公平訪問佇列,預設情況下由不公平策略訪問。

佇列本身不儲存任何元素,並且適用於可傳遞的場景。它將生產者執行緒處理的資料直接傳輸到使用者執行緒。它的吞吐量高於鏈結阻塞佇列和陣列阻塞佇列。

linkedtransferqueue

這是由鍊錶結構組成的fifo的無邊界阻塞傳輸佇列。它採用先發制人的方式,即有先發制人的方式時,直接採取先發制人的方式,並佔據該位置,直到得到該位置,超時或中斷為止。與其他阻塞佇列相比,有更多的trytransfer方法和傳輸方法。

linkedblockingdeque

是乙個由鍊錶組成的雙向阻塞佇列。可以從佇列兩端插入和移除元素。

該框架主要用於平行計算,將乙個大的人分成幾個小的任務,最後對每個小任務的結果進行彙總,得到框架的結果。fork將乙個大任務分成幾個子任務,並並行執行它們。join是合併這些子任務並最終得到大任務結果的結果。

竊取工作是指從其他佇列中竊取要執行的任務的執行緒。通常使用兩端佇列。被盜任務執行緒總是從兩端佇列的頭部獲取要執行的任務,被盜任務執行緒總是從兩端佇列的尾部獲取要執行的任務。

其優點是充分利用執行緒進行平行計算,減少了執行緒之間的競爭。缺點是在某些情況下存在競爭,例如當佇列只有乙個任務時,它將消耗更多的資源。

首先,將任務劃分為子任務,並將子任務連續劃分,直到子任務足夠小為止。

然後,執行任務並合併結果。分離的子任務被放置在雙端佇列中,然後幾個啟動執行緒從雙端佇列獲得任務執行。執行結果放在佇列中,啟動乙個執行緒從佇列中獲取資料,並合併這些執行緒。

Java併發程式設計之概念五 阻塞和非阻塞

概念描述 阻塞和非阻塞通常被用來形容多執行緒間的相互影響。解釋 當乙個執行緒占用了臨界區資源,那麼其它需要使用這個資源的執行緒都必須在這個臨界區上等待。等待會導致執行緒掛起,這樣就形成了阻塞。如果占用資源的執行緒一直沒有釋放資源,那麼其它的執行緒在這個臨界區上都不能繼續工作。相反,非阻塞表明多個執行...

併發程式設計之併發佇列

jdk 中提供了一系列場景的併發安全佇列。總的來說,按照實現方式的不同可分為阻塞佇列和非阻塞佇列,前者使用鎖實現,而後者則使用cas 非阻塞演算法實現。1 非阻塞佇列 concurrentlinkedqueue concurrentlinkedqueue是無界非阻塞佇列,內部使用單項鍊表實現 其中有...

併發程式設計 阻塞佇列BlockingQueue

在佇列中插入乙個佇列元素稱為入隊,從佇列中刪除乙個佇列元素稱為出隊。因為佇列只允許在一端插入,在另一端刪除,所以只有最早進入佇列的元素才能最先從佇列中刪除,故佇列又稱為先進先出 fifo first in first out 線性表。1 支援阻塞的插入方法 意思是當佇列滿時,佇列會阻塞插入元素的執行...