成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

詳解java中的阻塞隊列

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

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

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

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

應用場景:生產者消費者模式

java中的阻塞隊列

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

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

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

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

詳解java中的阻塞隊列

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

BlockQueue中方法

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

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

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

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

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

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

阻塞隊列的實現原理

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

阻塞隊列的阻塞喚醒依靠Condition——條件隊列來實現。

以ArrayBlockingQueue為例說明:

ArrayBlockingQueue的定義:

public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { /** The queued items */ //以數組的結構存儲隊列的元素,采用的是循環數組 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 */ //隊列中元素的個數 int count; /** Main lock guarding all access */ //對于ArrayBlockingQueue所有的操作都需要加鎖, final ReentrantLock lock; /** Condition for waiting takes */ //條件隊列,當隊列為空時阻塞消費者并在生產者生產后喚醒消費者 private final Condition notEmpty; /** Condition for waiting puts */ //條件隊列,當隊列滿時阻塞生產者,并在消費者消費隊列后喚醒生產者 private final Condition notFull;}

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

當隊列為空,消費者試圖消費時應該調用notEmpty.await()方法阻塞,并在生產者生產后調用notEmpty.single()方法 當隊列已滿,生產者試圖放入元素應調用notFull.await()方法阻塞,并在消費者消費隊列后調用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)方法就是阻塞的時候加了超時設定 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()方法的獲取過程。

/** * 從隊列中獲取元素 * 當隊列已空時阻塞當前線程 * 從隊列中消費元素后喚醒等待的生產線程 */ 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(); //消費元素后從喚醒阻塞的生產者線程 notFull.signal(); return x; }總結

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

以上就是詳解java中的阻塞隊列的詳細內容,更多關于java 阻塞隊列的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲激情成人在线| 欧美色老头old∨ideo| 欧美写真视频网站| 婷婷综合久久一区二区三区| 国产欧美一区二区三区另类精品| 国产精品欧美一区喷水| 91同城在线观看| 精品国产乱码久久久久久图片| 成人性生交大片免费| 欧美一区二区久久| 国产一区二区在线免费观看| 欧美日韩精品一区二区三区四区 | 88在线观看91蜜桃国自产| 日本中文字幕不卡| 欧美三区在线视频| 国产精品综合av一区二区国产馆| 欧美一区二区三区在线观看| 国产.精品.日韩.另类.中文.在线.播放| 88在线观看91蜜桃国自产| 国产精品 欧美精品| 日韩欧美精品在线| 97久久超碰国产精品电影| 国产区在线观看成人精品| 极品av少妇一区二区| 一区二区三区欧美日韩| 蜜桃av久久久亚洲精品| 毛片av中文字幕一区二区| 欧美美女直播网站| 国产高清视频一区| 久久久久久亚洲综合| 欧美日韩精品免费观看视频完整| 亚洲人成网站色在线观看| 国产精品毛片在线| 日韩有码一区二区三区| 欧美日韩视频在线第一区 | 欧美在线看片| 国产精品免费久久久久| 国产欧美综合一区二区三区| 亚洲va欧美va天堂v国产综合| 欧洲日韩一区二区三区| 国产成人av福利| 精品99999| 在线免费高清一区二区三区| 午夜欧美在线一二页| 在线观看成人小视频| 国产一区在线精品| 国产亚洲一区字幕| 国产精品视频免费一区| 六月丁香婷婷久久| 久久久久久久综合狠狠综合| av不卡免费看| 蜜臀av性久久久久蜜臀av麻豆| 欧美一区三区四区| 欧美日韩国产精品一卡| 亚洲国产欧美日韩另类综合| 欧美日本一区二区在线观看| 91丨九色丨蝌蚪富婆spa| 亚洲资源在线观看| 91麻豆精品国产91久久久更新时间 | 精品一区二区日韩| 亚洲精品在线网站| 亚洲最新在线| 国产乱对白刺激视频不卡| 国产欧美视频一区二区| 另类天堂av| 国产99一区视频免费| 国产精品久久久久一区二区三区共 | 亚洲经典自拍| 久久精品72免费观看| 精品欧美黑人一区二区三区| 国产综合亚洲精品一区二| 日本欧美久久久久免费播放网| 欧美成人综合网站| 一本久道久久久| 国产一区二区中文字幕| 综合在线观看色| 欧洲激情一区二区| 欧美日韩在线一二三| 日韩电影在线看| 久久久久久久网| 一本一道久久a久久精品综合蜜臀| aaa国产一区| 香蕉久久夜色精品国产使用方法| 精品奇米国产一区二区三区| 男人天堂欧美日韩| 不卡av在线免费观看| 亚洲第一会所有码转帖| 精品国产一区二区三区av性色| 国产精品一区二区欧美| youjizz国产精品| 亚洲国产另类av| 久久影院视频免费| 欧洲中文字幕精品| 亚洲欧洲午夜| 国产99精品国产| 亚洲成人精品影院| 欧美激情一区在线观看| 欧美日韩专区在线| 日韩一级在线| 成人性生交大片免费看中文| 亚洲一区在线电影| 精品处破学生在线二十三| 色婷婷久久一区二区三区麻豆| 你懂的国产精品| 久久疯狂做爰流白浆xx| 亚洲男人电影天堂| 亚洲精品一线二线三线| 在线精品视频一区二区| 国产在线成人| 国产精品69毛片高清亚洲| 亚洲图片欧美视频| 国产精品丝袜91| 日韩精品一区二区三区视频播放| 久久综合激情| 亚洲高清资源综合久久精品| 成人在线综合网站| 美女视频黄 久久| 一区二区三区国产精华| 久久久久久久久一| 91精品婷婷国产综合久久| 久久国产主播| 亚洲精品黄色| 欧美精品成人| 成人免费高清在线| 麻豆久久久久久| 亚洲成av人片在线观看| 亚洲视频一区二区在线| 国产香蕉久久精品综合网| 欧美一区二区在线免费观看| 色综合久久天天| 亚洲欧洲一区| 91影院在线观看| 国产成人精品免费视频网站| 久久国产欧美日韩精品| 三级一区在线视频先锋 | 亚洲在线日韩| 国产一区二区三区四区hd| 成人爽a毛片一区二区免费| 美女视频黄久久| 日日摸夜夜添夜夜添精品视频| 成人免费一区二区三区在线观看| 精品久久久久久亚洲综合网| 欧美日本一区二区三区四区| 91黄色免费看| 久久精品人人| av成人免费观看| 激情欧美丁香| 欧美日韩国产精品一区二区亚洲| 成人中文字幕电影| 国产精品亚洲一区二区三区在线| 久久精品国产99久久6| 性久久久久久久| 亚洲自拍偷拍图区| 洋洋成人永久网站入口| 亚洲区小说区图片区qvod| 亚洲欧洲国产专区| 亚洲欧洲一区二区在线播放| 欧美精品一区二区精品网| 欧美成人一区二区三区片免费 | 国产精品一级黄| 国产在线精品一区二区三区不卡 | 国产成人精品免费网站| 国产一区二区精品久久99| 日产国产欧美视频一区精品| 午夜激情一区二区三区| 亚洲国产精品视频| 亚洲国产综合91精品麻豆| 午夜久久久影院| 亚洲综合免费观看高清完整版在线| 亚洲三级小视频| 亚洲激情在线播放| 夜夜嗨av一区二区三区中文字幕| 一区二区三区日韩欧美精品 | 一区二区三区国产| 亚洲一区二区在线观看视频 | 欧美电影免费观看完整版| 日韩一级大片在线观看| 日韩一区二区高清| 欧美刺激午夜性久久久久久久| 欧美成人性福生活免费看| 久久中文娱乐网| 国产婷婷色一区二区三区| 国产精品午夜在线| 亚洲欧美中日韩| 一区二区三区精密机械公司| 亚洲国产一区二区三区| 日韩高清在线观看| 美国十次综合导航| 国产精品香蕉一区二区三区| 波波电影院一区二区三区| 欧美久久在线| 99亚洲一区二区| 色吊一区二区三区| 91精品国产色综合久久不卡蜜臀 | 韩国三级中文字幕hd久久精品| 国产一区二三区好的| 不卡的电影网站| 国产精品v欧美精品v日韩精品| 亚洲精品1234| 色噜噜狠狠一区二区三区果冻|