阻塞佇列理論以及使用

2021-09-19 13:22:09 字數 3389 閱讀 4692

在多執行緒領域,所謂阻塞,在某些情況下會掛起執行緒(即阻塞),一旦滿足條件,被掛起的執行緒又會自動被喚醒。

為什麼需要blockingqueue?

好處是我們不需要關心什麼時候需要阻塞執行緒,什麼時候需要喚醒執行緒,因為這一切blockingqueue已經做好阻塞的控制。

黃色標記的是重點!!!

arrayblockingqueue:由陣列結構組成的有界阻塞佇列。

inkedblockingqueue:有鍊錶結構組成的佇列,預設大小=為,integer.max_value。

priorityblockingqueue:支援優先順序排序的無界對列。

delayqueue:使用優先順序佇列實現的延遲無界佇列。

synchronousqueue:不儲存元素的阻塞佇列,也即單個元素的佇列。

linkedtransferqueue:由鍊錶結構組成的無界阻塞佇列。

linkedblockingdeque:由鍊錶結構組成的雙向阻塞佇列。

方法型別

丟擲異常

特殊值阻塞

超時插入

add(e)

offer(e)

put(e)

offer(e, time, unit)

移除remove()

poll()

take()

poll(time, unit)

檢查element()

peek()

不可用不可用

丟擲異常

當阻塞佇列滿時,再往佇列裡add插入元素就會拋 iilegalstateexception 異常

當阻塞佇列空時,再往佇列裡remove插入元素會拋 nosuchelementexception 異常

特殊值插入方法,成功true失敗false

移除方法,成功返回出佇列的元素,隊裡裡面沒有就返回null

一直阻塞

當阻塞佇列滿時,生產者執行緒繼續往佇列裡put元素,佇列會一直阻塞生產者執行緒直到put資料or響應中斷退出

當阻塞佇列空時,消費者執行緒試圖從佇列裡take元素,佇列會一直阻塞消費者執行緒直到佇列可用。

超時退出

當阻塞佇列滿時,佇列會阻塞生產者執行緒一定時間,超時後生產者執行緒退出

當阻塞佇列空時,佇列會阻塞消費者執行緒一定時間,超時後消費者執行緒退出

synchronousqueue沒有容量

與其他blockingqueue不同,synchronousqueue是乙個不儲存元素的blockingqueue。

每個put操作必須等待乙個take操作,否則不能繼續新增元素,反正依然。

* 資源類

*/class

sharedata

number++

; system.out.

println

(thread.

currentthread()

.getname()

+"\t"

+ number)

; condition.

signalall()

;}finally

}public

void

decrement()

throws exception

number--

; system.out.

println

(thread.

currentthread()

.getname()

+"\t"

+ number)

; condition.

signalall()

;}finally}}

public

class

producerconsumertxdemo

}catch

(exception e)}}

,"p"

+ i)

.start()

;}for(

int i =

0; i <

3; i++)}

catch

(exception e)}}

,"c"

+ i)

.start()

;}}}

用blockingqueue做生產者消費者

class

myresource

public

void

increment()

throws exception

else

thread.

sleep

(1000);

} system.out.

println

("生產停止");

}public

void

decrement()

throws exception

} system.out.

println

("消費停止");

}public

void

interrupt()

}public

class

producerconsumerblockingdemo

}catch

(exception e)}}

,"p"

+ i)

.start()

;}for(

int i =

0; i <

3; i++)}

catch

(exception e)}}

,"c"

+ i)

.start()

;}thread.

sleep(3

*1000);

system.out.

println

("******************************");

myresource.

interrupt();}}

阻塞佇列BlockingQueue使用

blockingqueue的原理及方法 blockingqueue最終會有四種狀況,丟擲異常 返回特殊值 阻塞 超時,下表總結了這些方法 丟擲異常 特殊值阻塞 超時插入add e offer e put e offer e,time,unit 移除remove poll take poll time...

阻塞佇列使用方式詳解

阻塞佇列 方法 處理方式 丟擲異常 返回特殊值 一直阻塞 超時退出 插入方法 add e offer e put e offer e,time,unit 移除方法 remove poll take poll time,unit 檢查方法 element peek 不可用不可用 丟擲異常 生產者在ad...

等待佇列 阻塞非阻塞

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