阻塞佇列簡介

2021-09-07 15:08:09 字數 963 閱讀 6115

阻塞佇列,顧名思義,首先它是乙個佇列,而乙個佇列在資料結構中所起的作用大致如下圖所示:

常用的佇列主要有以下兩種:(當然通過不同的實現方式,還可以延伸出很多不同型別的佇列,delayqueue就是其中的一種)

先進先出(fifo):先插入佇列的元素也最先出佇列,類似於排隊的功能。從某種程式上來說這種佇列體現了一種公平性。

後進先出(lifo):後插入佇列的元素最先出佇列,這種佇列優先處理最近發生的事件。

多執行緒環境中,通過佇列可以很容易實現資料共享,比如經典的「生產者」和「消費者」模型中,通過佇列可以很便利地實現兩者之間的資料共享。假設我們有若干生產者執行緒,另外又有若干個消費者執行緒,如果生產者執行緒需要把準備好的資料共享給消費者執行緒,利用佇列的方式來傳遞資料,就可以很方便地解決他們之間的資料共享問題。但如果生產者和消費者在某個時間段內,萬一發生資料處理速度不匹配的情況呢?理想情況下,如果生產者產出資料的速度大於消費者消費的速度,並且當生產出來的資料累計到一定程度的時候,那麼生產者必須暫停等待一下(阻塞生產者執行緒),以便等待消費者執行緒把累積的資料處理完畢,反之亦然。在多執行緒領域:所謂阻塞,在某些情況下會掛起執行緒(即阻塞),一旦條件滿足,被掛起的執行緒又會自動被喚醒,下面兩幅圖演示了blockingqueue的兩個常見阻塞場景:

如上圖所示:當佇列中沒有資料的情況下,消費者端的所有執行緒都會被自動阻塞(掛起),直到有資料放入佇列

如上圖所示:當佇列中填滿資料的情況下,生產者端的所有執行緒都會被自動阻塞(掛起),直到佇列中有空的位置,執行緒被自動喚醒。

等待佇列 阻塞非阻塞

阻塞 裝置驅動不阻塞,使用者想獲取裝置資源只能不停的查詢,這無謂的消耗cpu資源。而阻塞訪問,不能獲取資源的程序將進入休眠,它將cpu資源 禮讓 給其他程序 喚醒程序的地方最大可能發生在中斷裡面,因為硬體資源獲得的同時往往伴隨著乙個中斷 定義頭 wait queue head t queue 初始化...

阻塞佇列BlockingQueue

例介紹乙個特殊的佇列 blockingqueue,如果blockingqueue是空的,從blockingqueue取東西的操作將會被阻斷進入等待狀態,直到blockingqueue進了東西才會被喚醒,同樣,如果blockingqueue是滿的,任何試圖往裡存東西的操作也會被阻斷進入等待狀態,直到b...

12 阻塞佇列

非阻塞佇列 priorityqueue linkedlist linkedlist 是雙向鍊錶,它實現了 dequeue 介面 阻塞佇列 1 arrayblockingqueue 基於陣列實現的乙個阻塞佇列,在建立arrayblockingqueue 物件時必須制定容量大小。並且可以指定公平性與非公...