深入理解阻塞佇列(一) 基本結構

2021-08-14 07:37:26 字數 2237 閱讀 2208

blockingqueue是乙個繼承自queue的介面,在queue的佇列基礎上增加了阻塞操作。簡單來說,就是在在blockingqueue為空時從隊頭取資料將會被阻塞,因為此時還沒有資料可取,一旦佇列中有資料了,取資料的執行緒就會釋放得到了資料;如果blockingqueue有容量限制且滿了,那麼插入資料的執行緒將會阻塞,知道佇列中有空閒位置可以插入資料了,才會釋放。經過上面一段描述,可以發現這不就是乙個生產者-消費者模型嗎?

下面是blockingqueue的注釋中的乙個例子

class producer implements runnable 

public void run()

} catch (interruptedexception ex)

}object produce()

} class consumer implements runnable

public void run()

} catch (interruptedexception ex)

}void consume(object x)

} class setup

}}

blockingqueue是阻塞佇列的頂層介面,其下有很多實現類以及blockingdeque介面(雙端阻塞佇列)。關係如下圖: 

從上圖中可以看到整個blockingqueu的結構都是在queue的介面上擴充套件的,下面從queue開始分析每個類中入隊、出隊、檢索的方法。

入隊出隊

檢索區別

add()

remove()

element()

在執行方法失敗時不返回值,丟擲異常

offer()

poll()

peek()

在執行方法時,給出返回值,比如false、null

可以看到queue介面的三種操作:入隊、出隊和檢索均有兩個實現,區別在於其中乙個會在方法執行失敗時丟擲異常,而另乙個會在失敗時返回值。下面以入隊為例,add()方法在佇列已滿時將會丟擲異常,而offer()在佇列已滿時會返回false。

blockingqueue在queue介面的基礎上對入隊和出隊兩個操作分別又增加了阻塞方法,如下:

阻塞入隊

阻塞出隊

定時入隊

定時出隊

put(e e)

e take()

offer(e e,long timeout,timeunit unit)

e poll(long timeout,timeunit unit)

其中後面關於設定了時間的入隊和出隊操作,在時間到了之後如果還未執行成功,那麼返回false和null。

deque是乙個雙端佇列,既支援在隊頭執行入隊出隊,也支援在隊尾執行出隊。而queue只支援在隊頭出隊,在隊尾入隊。deque增加的介面如下:

隊頭入隊

隊頭出隊

隊尾入隊

隊尾出隊

隊頭檢索

隊尾檢索

區別addfirst()

removefirst()

addlast()

removelast()

getfirst()

getlast()

在方法執行失敗時會丟擲異常

offerfirst()

pollfirst()

offerlast()

polllast()

peekfirst()

peeklast()

在方法執行失敗時會返回false或者null

blockingdeque在deque的基礎上增加了阻塞的方法,增加的方法如下:

阻塞隊頭入隊

阻塞隊頭出隊

阻塞隊尾入隊

阻塞隊尾出隊

區別putfirst(e e)

e takefirst()

putlast(e e)

e takelast()

沒有超時設定

offerfirst(e e,long timeout,timeunit unit)

e pollfirst(long timeout,timeunit unit)

offerlast(e e,long timeout,timeunit unit)

e polllast(long timeout,timeunit unit)

在超時之後,返回false或者null

深入理解阻塞佇列(一) 基本結構

blockingqueue是乙個繼承自queue的介面,在queue的佇列基礎上增加了阻塞操作。簡單來說,就是在在blockingqueue為空時從隊頭取資料將會被阻塞,因為此時還沒有資料可取,一旦佇列中有資料了,取資料的執行緒就會釋放得到了資料 如果blockingqueue有容量限制且滿了,那麼...

深入理解阻塞socket和非阻塞socket

什麼是阻塞socket,什麼是非阻塞socket。對於這個問題,我們要先弄清什麼是阻塞 非阻塞。阻塞與非阻塞是對乙個檔案描述符指定的檔案或裝置的兩種工作方式。阻塞的意思是指,當試圖對該檔案描述符進行讀寫時,如果當時沒有東西可讀或者暫時不可寫,程式就進入等待狀態,直到有東西可讀或者可寫為止。非阻塞的意...

深入理解Redis 一 基本資料結構

個人主頁 tuzhenyu s page 內部資料結構主要包括 動態字串,雙端鍊錶,字典,跳躍表 記憶體對映資料結果主要包括 整數集合,壓縮列表 struct sdssds使用抽象結構中的len來判斷字元創的結尾,而不是像c一樣使用空字元 0 表示結尾,保證了二進位制的安全 typedef stru...