日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

詳解java中的阻塞隊列

瀏覽:29日期:2022-08-31 10:00:04
阻塞隊列簡介

阻塞隊列(BlockingQueue)首先是一個支持先進先出的隊列,與普通的隊列完全相同;其次是一個支持阻塞操作的隊列,即:

當隊列滿時,會阻塞執(zhí)行插入操作的線程,直到隊列不滿。 當隊列為空時,會阻塞執(zhí)行獲取操作的線程,直到隊列不為空。

阻塞隊列用在多線程的場景下,因此阻塞隊列使用了鎖機制來保證同步,這里使用的可重入鎖;而對于阻塞與喚醒機制則有與鎖綁定的Condition實現(xiàn)

應(yīng)用場景:生產(chǎn)者消費者模式

java中的阻塞隊列

java中的阻塞隊列根據(jù)容量可以分為有界隊列和無界隊列:

有界隊列:隊列中只能存儲有限個元素,超出后存放元素線程會被阻塞或者失敗。 無界隊列:隊列中可以存儲無限個元素。

java8中提供了7種阻塞隊列阻塞隊列供開發(fā)者使用,如下表:類名 描述 ArrayBlockingQueue 一個由數(shù)組結(jié)構(gòu)組成的有界阻塞隊列 LinkedBlockingQueue 由鏈表結(jié)構(gòu)組成的有界阻塞隊列(默認大小Integer.MAX_VALUE) PriorityBlockingQueue 支持優(yōu)先級排序的無界阻塞隊列 DelayQueue 使用優(yōu)先級隊列實現(xiàn)的延遲無界阻塞隊列 SynchronousQueue 不存儲元素的阻塞隊列,即單個元素的隊列 LinkedTransferQueue 由鏈表結(jié)構(gòu)組成的無界阻塞隊列 LinkedBlockingDeque 由鏈表結(jié)構(gòu)組成的雙向阻塞隊列

另外還有一個在ScheduledThreadPoolExecutor中實現(xiàn)的DelayedWorkQueue阻塞隊列,但這個阻塞隊列開發(fā)者不能使用。它們之間的UML類圖如下圖:

詳解java中的阻塞隊列

BlockingQueue接口是阻塞隊列對外的訪問接口,所有的阻塞隊列都實現(xiàn)了BlockQueue中的方法

BlockQueue中方法

作為一個隊列的核心方法就是入隊和出隊。由于存在阻塞策略,BlockQueue將出隊入隊的情況分為了四組,每組提供不同的方法:

拋出異常:當隊列滿時,如果再往隊列中插入元素,則拋出IllegalStateException異常;當隊列為空時,從隊列中獲取元素則拋出NoSuchElementException異常。 返回特定值(布爾值):當隊列滿時,如果再往隊列中插入元素,則返回false;當隊列為空時,從隊列中獲取元素則返回null。 一直阻塞:當隊列滿時,如果再往隊列中插入元素,阻塞當前線程直到隊列中至少一個被移除或者響應(yīng)中斷退出;當隊列為空時,則阻塞當前線程直到至少一個元素元素入隊或者響應(yīng)中斷退出。 超時退出:當隊列滿時,如果再往隊列中插入元素,阻塞當前線程直到隊列中至少一個被移除或者達到指定的等待時間退出或者響應(yīng)中斷退出;當隊列為空時,則阻塞當前線程直到至少一個元素元素入隊或者達到指定的等待時間退出或者響應(yīng)中斷退出。

對于每種情況BlockingQueue提供的方法如下表:

方法處理方式 拋出異常 返回特定值(布爾值) 一直阻塞 超時退出 插入 add(e) offer(e) put(e) offer(e,time,unit) 移除 remove() poll() take() poll(time.unit) 檢查 element() peek() 不可用 不可用

上述方法一般用于生產(chǎn)者-消費者模型中,是其中的生產(chǎn)和消費操作隊列的核心方法。除了這些方法,BlockingQueue還提供了一些其他的方法如下表:

方法名稱 描述 remove(Object o) 從隊列中移除一個指定值 size() 獲取隊列中元素的個數(shù) contains(Object o) 判斷隊列是否包含指定的元素,但是這個元素在這次判斷完可能就會被消費 drainTo(Collection<? super E> c) 將隊列中元素放在給定的集合中,并返回添加的元素個數(shù) drainTo(Collection<? super E> c, int maxElements) 將隊列中元素取maxElements(不超過隊列中元素個數(shù))個放在給定的集合中,并返回添加的元素個數(shù) remainingCapacity() 計算隊列中還可以存放的元素個數(shù) toArray() 以objetc數(shù)組的形式獲取隊列中所有的元素 toArray(T[] a) 以給定類型數(shù)組的方式獲取隊列中所有的元素 clear() 清空隊列,危險的操作

阻塞隊列的實現(xiàn)原理

阻塞隊列的實現(xiàn)依靠通知模式實現(xiàn):當生產(chǎn)者向滿了的隊列中添加元素時,會阻塞住生產(chǎn)者,直到消費者消費了一個隊列中的元素后會通知消費者隊列可用,此時再由生產(chǎn)者向隊列中添加元素。反之亦然。

阻塞隊列的阻塞喚醒依靠Condition——條件隊列來實現(xiàn)。

以ArrayBlockingQueue為例說明:

ArrayBlockingQueue的定義:

public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { /** The queued items */ //以數(shù)組的結(jié)構(gòu)存儲隊列的元素,采用的是循環(huán)數(shù)組 final Object[] items; /** items index for next take, poll, peek or remove */ //隊列的隊頭索引 int takeIndex; /** items index for next put, offer, or add */ //隊列的隊尾索引 int putIndex; /** Number of elements in the queue */ //隊列中元素的個數(shù) int count; /** Main lock guarding all access */ //對于ArrayBlockingQueue所有的操作都需要加鎖, final ReentrantLock lock; /** Condition for waiting takes */ //條件隊列,當隊列為空時阻塞消費者并在生產(chǎn)者生產(chǎn)后喚醒消費者 private final Condition notEmpty; /** Condition for waiting puts */ //條件隊列,當隊列滿時阻塞生產(chǎn)者,并在消費者消費隊列后喚醒生產(chǎn)者 private final Condition notFull;}

根據(jù)類的定義字段可以看到,有兩個Condition條件隊列,猜測以下過程

當隊列為空,消費者試圖消費時應(yīng)該調(diào)用notEmpty.await()方法阻塞,并在生產(chǎn)者生產(chǎn)后調(diào)用notEmpty.single()方法 當隊列已滿,生產(chǎn)者試圖放入元素應(yīng)調(diào)用notFull.await()方法阻塞,并在消費者消費隊列后調(diào)用notFull.single()方法向隊

向隊列中添加元素put()方法的添加過程。

/** * 向隊列中添加元素 * 當隊列已滿時需要阻塞當前線程 * 放入元素后喚醒因隊列為空阻塞的消費者 */ public void put(E e) throws InterruptedException { checkNotNull(e); final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { //當隊列已滿時需要notFull.await()阻塞當前線程 //offer(e,time,unit)方法就是阻塞的時候加了超時設(shè)定 while (count == items.length) notFull.await(); //放入元素的過程 enqueue(e); } finally { lock.unlock(); } } /**enqueue實際添加元素的方法*/ private void enqueue(E x) { // assert lock.getHoldCount() == 1; // assert items[putIndex] == null; final Object[] items = this.items; items[putIndex] = x; if (++putIndex == items.length) putIndex = 0; count++; //如果條件隊列中存在等待的線程 //喚醒 notEmpty.signal(); }

從隊列中獲取元素take()方法的獲取過程。

/** * 從隊列中獲取元素 * 當隊列已空時阻塞當前線程 * 從隊列中消費元素后喚醒等待的生產(chǎn)線程 */ public E take() throws InterruptedException { final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { //隊列為空需要阻塞當前線程 while (count == 0) notEmpty.await(); //獲取元素的過程 return dequeue(); } finally { lock.unlock(); } } /**dequeue實際消費元素的方法*/ private E dequeue() { // assert lock.getHoldCount() == 1; // assert items[takeIndex] != null; final Object[] items = this.items; @SuppressWarnings('unchecked') E x = (E) items[takeIndex]; items[takeIndex] = null; if (++takeIndex == items.length) takeIndex = 0; count--; if (itrs != null) itrs.elementDequeued(); //消費元素后從喚醒阻塞的生產(chǎn)者線程 notFull.signal(); return x; }總結(jié)

阻塞隊列提供了不同于普通隊列的增加、刪除元素的方法,核心在與隊列滿時阻塞生產(chǎn)者和隊列空時阻塞消費者。這一阻塞過程依靠與鎖綁定的Condition對象實現(xiàn)。Condition接口的實現(xiàn)在AQS中實現(xiàn),具體的實現(xiàn)類是ConditionObject

以上就是詳解java中的阻塞隊列的詳細內(nèi)容,更多關(guān)于java 阻塞隊列的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品福利一区二区三区| 精品久久97| 久草免费在线视频| 国产精品成人一区二区不卡| 精品久久视频| 国产精品xx| 韩国久久久久久| 国产精品伦理久久久久久| 国产一区二区三区网| 国产一区二区三区探花| 日本午夜精品视频在线观看| 日韩av影院| 国产精品tv| 国产一区二区三区久久| 欧洲一区二区三区精品| 亚洲二区免费| 免费视频久久| 日本aⅴ精品一区二区三区| 欧美亚洲福利| 麻豆精品av| 亚洲欧洲美洲av| 99久久久久国产精品| 国产美女一区| 欧美一级二级视频| 精品99久久| 国产成人精选| 色吊丝一区二区| 欧美成人综合| 蜜臀av国产精品久久久久| 日韩av黄色在线| 久久精品福利| 亚洲v在线看| 一区二区精品| 国产精品免费不| а√天堂中文在线资源8| 亚州av乱码久久精品蜜桃| 综合一区在线| 精品国产黄a∨片高清在线| 蜜臀久久99精品久久一区二区| 美女精品在线观看| 久久国产精品色av免费看| 国产精品久久久久久久久妇女| 久久国产免费| 日韩久久一区| 91日韩免费| 99国产精品久久久久久久| 欧美日韩1区| 中文字幕系列一区| 久久亚洲精品伦理| 国产欧美日韩在线一区二区| 中文字幕在线官网| 1024精品久久久久久久久| 日韩高清三区| 国产福利片在线观看| 亚洲欧洲av| 国产96在线亚洲| 在线看片一区| 日韩免费福利视频| 91成人在线网站| 久久九九精品| 日韩在线网址| 久久久精品日韩| 911亚洲精品| 黑丝一区二区三区| 精品国产美女a久久9999| 免费日韩av| 黄色在线观看www| 亚洲人成在线影院| 成人免费电影网址| 国产乱子精品一区二区在线观看 | 国产精品日本一区二区不卡视频| 四虎4545www国产精品| 国产探花在线精品一区二区| 91精品婷婷色在线观看| 欧美自拍一区| 亚洲精品97| 国产不卡精品| 国产亚洲第一伦理第一区| 亚洲女同一区| 国产精品毛片一区二区在线看| 亚洲精品亚洲人成在线观看| 91精品一区二区三区综合在线爱| 亚洲精品伦理| 久久久久美女| 久久亚州av| 欧美日韩亚洲一区二区三区在线| 最新亚洲激情| 欧美亚洲日本精品| 国产精品亚洲欧美一级在线| 国产视频一区三区| 91看片一区| 久久伊人久久| 久久精品99久久久| 中文字幕日韩高清在线| 免费不卡中文字幕在线| 国产a久久精品一区二区三区| 日韩二区在线观看| 精品在线99| 伊人网在线播放| 精品国产精品国产偷麻豆| 69堂免费精品视频在线播放| 视频精品一区二区| 精品国产99| 亚洲大全视频| 国产a亚洲精品| 国产精品日韩精品在线播放| 久久先锋影音| 欧美女激情福利| 私拍精品福利视频在线一区| 国产精品毛片一区二区在线看| 国产精品久久久久久妇女 | 日韩欧美综合| 精品国产网站| 美女视频免费精品| 国产精品巨作av| 欧美日本三区| 欧美一区成人| 国产亚洲人成a在线v网站| 日韩在线麻豆| 亚洲精品影视| 日韩午夜视频在线| 日本中文字幕不卡| 亚洲人成亚洲精品| 久久国产高清| 免费成人在线影院| 亚洲精选久久| 蜜臀a∨国产成人精品| 免费视频最近日韩| 亚洲日本免费电影| 日韩高清在线观看一区二区| 日本亚洲不卡| 日本午夜精品久久久久| 久久精品超碰| 久久久国产精品入口麻豆| 91精品韩国| 久久久久免费av| 91精品一区国产高清在线gif| 欧美日韩尤物久久| 久久久精品久久久久久96| 欧美性感美女一区二区| 亚洲女同一区| 亚洲视频综合| 好吊视频一区二区三区四区| 在线视频精品| 亚洲3区在线| 日本午夜免费一区二区| 国产探花一区| 麻豆成人在线观看| 日本а中文在线天堂| 久久美女精品| 国产精品外国| 欧美日韩一区自拍| 欧美交a欧美精品喷水| 狠狠久久伊人中文字幕| 国产黄大片在线观看| 激情婷婷亚洲| 亚洲欧美高清| 欧美视频一区| 国产欧洲在线| 欧美另类综合| 欧美一区91| 国产成人精选| 在线国产一区| 日韩高清在线不卡| 久久精品天堂| 久久国产电影| 日韩中文字幕| 国内自拍视频一区二区三区| 日韩国产在线一| 另类av一区二区| 日本aⅴ亚洲精品中文乱码 | 日韩精品一二三区| 欧美日韩一区二区三区不卡视频 | 亚洲欧美在线专区| 国产精品草草| 激情视频一区二区三区| 日本中文字幕一区二区| 欧美xxxx性| 亚洲精品在线观看91| 日本中文字幕视频一区| 日韩av片子| 亚洲资源网站| 神马久久午夜| 中文字幕视频精品一区二区三区| 久久中文在线| 玖玖精品视频| 国产粉嫩在线观看| 亚洲区第一页| 国产精品yjizz视频网| 久久亚洲国产精品一区二区| 另类综合日韩欧美亚洲| 欧美日韩国产亚洲一区| 欧美色综合网| 欧美成人国产| 国产精品xxx| 91精品成人| 国内精品伊人| 日韩高清电影一区| 久久精品欧美一区| 天海翼亚洲一区二区三区|