併發工具包 阻塞佇列BlockingQueue

2021-08-10 15:36:31 字數 2203 閱讀 5101

阻塞佇列,顧名思義:如果佇列滿了,那麼會進入阻塞狀態,當有消費者從佇列中取出資料後,再解除阻塞狀態。如果隊列為空,從佇列中取資料就會進入阻塞狀態。直至佇列中有資料為止。

blockingqueue是介面,目前已知的實現類如下:

arrayblockingqueue:底層底層通過陣列來儲存佇列中的元素,所以建立時需要指定容量。

linkedblockingqueue:底層通過鍊錶來實現,「無界」的阻塞佇列。最多能夠存放integer.max_value個元素。

priorityblockingqueue:是乙個無界的併發佇列,實現自動排序的功能。無法插入null值,所有插入的資料需要實現comparable介面。

synchronousqueue:安全的佇列,這個佇列裡只能存乙個資料。與執行緒池連用組成「大池子小佇列」模式。

存入元素時:

/**arrayblockingqueue:底層通過陣列來儲存佇列中的元素,

* 所以建立物件時需要指定容量(陣列開闢位址空間時使用)

* size():獲取的是佇列中已經新增的元素的個數,而不是指定的容量。

* 1在佇列未滿時執行以下方法:

* boolean add(..):可以正常執行,並返回true

* boolean offer(..):可以正常新增,並返回true

* void put(..):可以正常新增,並沒有產生阻塞。

* offer(o, timeout, timeunit) :

* o:被新增的元素

* timeout:時間的值

* timeunit:時間的單位

* 直接執行新增,並不會產生阻塞。

* 2在佇列已滿時執行以下方法:

* add(..):丟擲illegalstateexception: queue full

* boolean offer(..):新增失敗,返回false

* void put(..):會產生阻塞,阻塞直到阻塞物件變為未滿時才釋放。

* offer(o, timeout, timeunit) :會產生阻塞,在指定的

* 時間內如果阻塞佇列中有空間則阻塞釋放,向佇列中新增元素;

* 如果指定的時間到了,而阻塞佇列一直是滿的狀態,返回false.

*/public

void

testput()

try catch (interruptedexception e)

}

取出元素時:

/**1在阻塞佇列中還存在元素:

* e remove():獲取先存入的元素並返回該元素,並將該元素從阻

* 塞佇列中刪除。

* boolean remove(..):刪除指定的元素,刪除成功返回true,

* 反之返回false

* poll():獲取最先存入的元素,並返回。

* e poll(long timeout, timeunit unit):獲取最先存入的元素,

* 並返回。

* e take():獲取最先存入的元素。

* 以上方法,獲取阻塞佇列中的元素後,阻塞佇列中將不再有該元素。

* 2在阻塞佇列不存在元素:

* t remove():丟擲nosuchelementexception

* boolean remove(..):刪除指定的元素,刪除成功返回true,

* 反之返回false

* poll():返回null

* poll(long timeout, timeunit unit):產生阻塞,等待指定的

* 時間;如果在該時間記憶體入了元素,那麼直接獲取先存入的元素。

* 如果在該時間內容沒有存入元素,待時間結束後阻塞釋放,不再獲取。

* take():產生阻塞,直到有元素存入;並將獲取到的元素返回。

*/public

void

testtake() catch (interruptedexception e)

system.out.println();

}

使用的方法和arrayblockingqueue相同。

使用的方法和arrayblockingqueue相同。

存入的元素會被排序,排序的規則和實現的comparable內容有關。

java 併發工具包 BlockingQueue

blockingqueue 是乙個介面,字義上理解表示為乙個阻塞佇列 1 生產者入隊 2 消費者出隊 blockingqueue 具有 4 組不同的方法用於插入 移除以及對佇列中的元素進行檢查。如果請求的操作不能得到立即執行的話,每個方法的表現也不同。這些方法如下 拋異常 特定值 阻塞 超時 四組不...

jdk併發工具包之鎖

1 cynchronized擴充套件 可重如鎖reentrantlock reentrantlock是通過cas演算法實現的 renntrantlock lock new reentrantlock lock.lock 如果資源被占用則會等待 鎖定區域 finally 必須手動解鎖 lock.unl...

拷貝工具包

常用工具包封裝.懶得引各種雜七八的包,輕量級包.cglib還是需要的 scope provided 1.0.0 copyutils beancopier封裝.提供簡單的單一複製與list複製.不支援自定義建構函式的類的複製.abc abc copyutil copysigle abc class o...