在多執行緒領域,所謂阻塞,在某些情況下會掛起執行緒(即阻塞),一旦滿足條件,被掛起的執行緒又會自動被喚醒。為什麼需要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沒有容量每個put操作必須等待乙個take操作,否則不能繼續新增元素,反正依然。與其他blockingqueue不同,synchronousqueue是乙個不儲存元素的blockingqueue。
* 資源類
*/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 初始化...