多線程之間的交互:線程閥(一)之阻塞隊列BlockingQueue簡介

投入多少,收穫多少;參與多深,領悟多深
參考文獻:Java併發變成從入門到精通

線程閥是一種線程與線程之間相互制約和相互交互機制

阻塞隊列BlockingQueue

Queue(隊列):用於保存一組原色,不過在存儲元素的時候必須遵循先進先出原則。隊列是一種特殊的線性表,它只允許在表的前段進行刪除操作,而在表的後端進行插入操作。進行插入操作的端稱爲隊尾,進行刪除操作的端稱爲對頭。對列中沒有元素時稱爲空隊列。在隊列這種數據結構中,最先插入的元素將是最先被刪除的元素,反之最後插入的元素將是最後被刪除的元素,因此隊列又稱爲先進先出的線性表。

Deque(雙端對列):兩端都可以進行進出的隊列。當我們約束從對列的一段進出對時,就形成了另一種存儲模式,它遵循先進後出原則,這就是棧結構。雙端隊列主要用於棧操作。

BlockingQueue(阻塞對列):是支持兩個附加操作的隊列。這兩個附加操作是:在隊列爲空時,獲取元素線程會等待隊列爲非空;當隊列滿時,存儲元素線程會等待隊列可用。
阻塞隊列常用於生產者和消費者的場景,生產者是往隊列裏添加元素的線程,消費者是從隊列中獲取元素的線程、阻塞隊列是生產者存放元素和消費者獲取元素的容器

阻塞隊列提供了四中處理方法

這裏寫圖片描述

拋出異常:當阻塞隊列滿時,再往隊列裏插入元素,會拋出IllegalStateException(“Queue full”)異常。當隊列爲空是,從隊列裏拿取元素時(移除方法)會拋出NoSuchElementException異常

返回特殊值:插入方法會返回是否成功,若成功則返回true,移除方法,則是從隊列裏拿出一個元素,若是沒有則返回null。

一直阻塞:當阻塞隊列滿時,如果生產者線程往隊列裏put元素時,隊列會一直阻塞生產者線程,直至隊列拿到數據,或者響應中斷推出。當隊列爲空時,消費者線程試圖從隊列中take元素,隊列也會阻止消費者線程,直至隊列可用。

超時退出:當阻塞隊列滿時,隊列會阻塞生產者線程一段時間,如果超出一定時間,生產者線程就會退出;當阻塞隊列爲空時,隊列會阻塞消費者線程一段時間,如果超出一定時間,消費者線程就會退出。

BlockingQueue常用的幾種方法

add(anObject):把anObject加到BlockingQueue裏,如果BlockingQueue可以容納則返回true,否則拋出異常;

offer(anObject):表示如果可能的話,將anObject加到BlockingQueue裏,如果BlockingQueue可以容納則返回true,否則返回false;

put(anObject):把anObject加到BlockingQueue裏,如果BlockingQueue沒有空間,則調用此方法的線程被阻塞,直到BlockingQueue裏面有空間在繼續;

poll(time):取走BlockingQueue裏排在首位的對象,若不能立即取出,則可以等時間參數規定的時間,去不到時返回null

take():取走BlockingQueue裏排在首位的對象,若BlockingQueue爲空,阻塞進入等待狀態直至BlockingQueue有新的對象被加入爲止;

BlockingQueue不接受null元素,試圖add、put、offer一個null元素時,某些實現會拋出NullPointerExceprion異常。

JDK中提供的阻塞隊列,後續會逐一學習

BlockingDeque
DelayQueue
ArrayBlockingQueue
LinkedBlockingQueue
LinkedBlockingDeque
PriorityBlockingQueue
SynchronousQueue

發佈了45 篇原創文章 · 獲贊 22 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章