阻塞佇列 BlockingQueue

2021-10-10 04:51:57 字數 2962 閱讀 5007

​什麼是阻塞佇列呢?

首先,它是乙個佇列,先進先出。其次,它是被阻塞了的。

當阻塞隊列為空時,我們從佇列從獲取元素的操作會被阻塞。

當阻塞佇列滿了時,我們往佇列新增元素的操作會被阻塞。

我們常用的阻塞佇列是blockqueue:通過blockqueue,我們不需要關心什麼時候需要阻塞執行緒,什麼時候需要喚醒執行緒,這一切blockqueue已經幫我們做完了。

blockqueue是乙個介面,有七個實現類:

我們最常用的有三個:

blockqueue的核心方法:

方法型別

丟擲異常

特殊值阻塞

超時插入

add(e)

offer(e)

put(e)

offer(e,time,unit)

移除remove()

poll()

take()

poll(time,unit)

檢查element()

peek()無無

丟擲異常:

執行add()方法,向已經滿了的阻塞佇列中新增元素時,會丟擲異常。

public class blockqueuedemo}
執行結果:

從已空的阻塞佇列中取出元素,也會報異常:

public class blockqueuetest}
特殊值:

正常true,異常false,取值異常為null

阻塞:如果新增不進去或取不出來,就會一直阻塞

超時:我們可以設定乙個超時時間,如果一直新增不進去或取不出來,超出時間就會返回特殊值

synchronousqueuesynchronousqueue每put乙個元素,都需要take之後才能繼續新增元素。

阻塞佇列之經典場景:生產者與消費者模式

public class prodconsumer_blockqueuedemo  catch (interruptedexception e)},"product").start();new thread(()-> catch (interruptedexception e)},"consumer").start();try  catch (interruptedexception e)system.out.println();system.out.println();system.out.println("5秒鐘時間到,main執行緒叫停,活動結束");myresource.stop();}}class myresourcepublic void myproduct() throws interruptedexception elsetimeunit.seconds.sleep(1);}system.out.println(thread.currentthread().getname() + "\t叫停,表示flag = false,生產動作結束");}public void myconsumer() throws interruptedexceptionsystem.out.println(thread.currentthread().getname() + "\t 消費佇列"+result+"成功");}}public void stop()}
執行結果:

併發工具包 阻塞佇列BlockingQueue

阻塞佇列,顧名思義 如果佇列滿了,那麼會進入阻塞狀態,當有消費者從佇列中取出資料後,再解除阻塞狀態。如果隊列為空,從佇列中取資料就會進入阻塞狀態。直至佇列中有資料為止。blockingqueue是介面,目前已知的實現類如下 arrayblockingqueue 底層底層通過陣列來儲存佇列中的元素,所...

等待佇列 阻塞非阻塞

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

阻塞佇列BlockingQueue

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