java concurent之BlockingQueue

從名字上看,BlockingQueue是阻塞隊列的意思
這個隊列主要提供下面的功能:
阻塞隊列提供了可阻塞的take和put方法,另外可定時的poll和offer實際原理也是一樣的。
如果BlockingQueue是空的,從BlockingQueue取東西的操作將會被阻斷進入等待狀態,直到BlockingQueue進了東西纔會被喚醒,同樣,如果BlockingQueue是滿的,任何試圖往裏存東西的操作也會被阻斷進入等待狀態,直到BlockingQueue裏有空間時纔會被喚醒繼續操作。
阻塞隊列有一般分爲兩類 無限阻塞隊列和有限阻塞隊列。有限阻塞隊列中,當隊列滿時,調用put方法將會阻塞;而無限阻塞隊列中,put方法是不會阻塞的。
很顯然這個隊列的一種最常用的場景就是 生產者-消費者 模式
它有以下具體實現類:
ArrayBlockingQueue:採用數組作爲存儲隊列的阻塞隊列,這個隊列採用FIFO的方式管理數據
LinkedBlockingQueue:採用鏈式結構作爲存儲隊列,同樣它也採用FIFO的方式管理數據
PriorityBlockingQueue:採用基於優先級堆的極大優先級隊列作爲存儲隊列。
SynchronousQueue:特殊的BlockingQueue,其中每個 put 必須等待一個 take,反之亦然。
DelayQueue:這是一個無限阻塞隊列,只有在延遲期滿時才能從中提取元素。該隊列的頭部是延遲期滿後保存時間最長的 Delayed 元素。如果延遲都還沒有期滿,則隊列沒有頭部。
通過查看源代碼可以看到這個類內部是採用PriorityQueue作爲存儲隊列

DelayQueue的一些常用的場景
a) 關閉空閒連接。服務器中,有很多客戶端的連接,空閒一段時間之後需要關閉之。
b) 緩存。緩存中的對象,超過了空閒時間,需要從緩存中移出。
c) 任務超時處理。在網絡協議滑動窗口請求應答式交互時,處理超時未響應的請求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章