Java并發(fā)編程:阻塞隊列

Java并發(fā)編程:阻塞隊列
BlockingQueue

阻塞隊列分類
ArrayBlockingQueue :一個由數(shù)組結(jié)構(gòu)組成的有界阻塞隊列。
LinkedBlockingQueue :一個由鏈表結(jié)構(gòu)組成的有界阻塞隊列鸠澈。
PriorityBlockingQueue :一個支持優(yōu)先級排序的無界阻塞隊列。
DelayQueue:一個使用優(yōu)先級隊列實現(xiàn)的無界阻塞隊列休玩。
SynchronousQueue:一個不存儲元素的阻塞隊列狂鞋。
LinkedTransferQueue:一個由鏈表結(jié)構(gòu)組成的無界阻塞隊列片择。
LinkedBlockingDeque:一個由鏈表結(jié)構(gòu)組成的雙向阻塞隊列。
操作.png

以上7類阻塞隊列中有LinkedBlockingQueue,DelayQueue,SynchronousQueue被用在了線程池當(dāng)中骚揍,其中LinkedBlockingQueue被使用在FixedThreadPool,SingleThreadExecutor中字管,SynchronousQueue被用在CachedThreadPool中,DelayQueue被使用在ScheduledThreadPoolExecutor中信不。

SynchronousQueue之所以用在CachedThreadPool中嘲叔,是因為SynchronousQueue不像ArrayBlockingQueue或LinkedListBlockingQueue,SynchronousQueue內(nèi)部并沒有數(shù)據(jù)緩存空間抽活,你不能調(diào)用peek()方法來看隊列中是否有數(shù)據(jù)元素硫戈,因為數(shù)據(jù)元素只有當(dāng)你試著取走的時候才可能存在,不取走而只想偷窺一下是不行的下硕,當(dāng)然遍歷這個隊列的操作也是不允許的丁逝。
SynchronousQueue的一個使用場景是在線程池里。Executors.newCachedThreadPool()就使用了SynchronousQueue梭姓,這個線程池根據(jù)需要(新任務(wù)到來時)創(chuàng)建新的線程霜幼,如果有空閑線程則會重復(fù)使用,線程空閑了60秒后會被回收誉尖,并不會等待空閑線程產(chǎn)生罪既。

1.非阻塞隊列中的幾個主要方法:

add(E e):將元素e插入到隊列末尾,如果插入成功铡恕,則返回true琢感;如果插入失敗(即隊列已滿)探熔,則會拋出異常驹针;
  remove():移除隊首元素,若移除成功诀艰,則返回true牌捷;如果移除失敗(隊列為空)涡驮,則會拋出異常;
  offer(E e):將元素e插入到隊列末尾喜滨,如果插入成功捉捅,則返回true;如果插入失斔浞纭(即隊列已滿)棒口,則返回false寄月;
  poll():移除并獲取隊首元素,若成功无牵,則返回隊首元素漾肮;否則返回null;
  peek():獲取隊首元素茎毁,若成功克懊,則返回隊首元素;否則返回null
  對于非阻塞隊列七蜘,一般情況下建議使用offer谭溉、poll和peek三個方法,不建議使用add和remove方法橡卤。因為使用offer扮念、poll和peek三個方法可以通過返回值判斷操作成功與否,而使用add和remove方法卻不能達(dá)到這樣的效果碧库。注意柜与,非阻塞隊列中的方法都沒有進行同步措施。

2.阻塞隊列中的幾個主要方法:

阻塞隊列包括了非阻塞隊列中的大部分方法嵌灰,上面列舉的5個方法在阻塞隊列中都存在弄匕,但是要注意這5個方法在阻塞隊列中都進行了同步措施。除此之外伞鲫,阻塞隊列提供了另外4個非常有用的方法:
  put(E e)
  take()
  offer(E e,long timeout, TimeUnit unit)
  poll(long timeout, TimeUnit unit)
  put方法用來向隊尾存入元素粘茄,如果隊列滿,則等待;
  take方法用來從隊首取元素秕脓,如果隊列為空柒瓣,則等待;
  offer方法用來向隊尾存入元素吠架,如果隊列滿芙贫,則等待一定的時間,當(dāng)時間期限達(dá)到時傍药,如果還沒有插入成功磺平,則返回false;否則返回true拐辽;
  poll方法用來從隊首取元素拣挪,如果隊列空,則等待一定的時間俱诸,當(dāng)時間期限達(dá)到時菠劝,如果取到,則返回null睁搭;否則返回取得的元素赶诊;

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

事實它和我們用Object.wait()笼平、Object.notify()和非阻塞隊列實現(xiàn)生產(chǎn)者-消費者的思路類似,只不過它把這些工作一起集成到了阻塞隊列中實現(xiàn)舔痪。

在并發(fā)編程中寓调,一般推薦使用阻塞隊列,這樣實現(xiàn)可以盡量地避免程序出現(xiàn)意外的錯誤锄码。

阻塞隊列使用最經(jīng)典的場景就是socket客戶端數(shù)據(jù)的讀取和解析夺英,讀取數(shù)據(jù)的線程不斷將數(shù)據(jù)放入隊列,然后解析線程不斷從隊列取數(shù)據(jù)解析巍耗。還有其他類似的場景秋麸,只要符合生產(chǎn)者-消費者模型的都可以使用阻塞隊列。 具體見轉(zhuǎn)載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炬太,一起剝皮案震驚了整個濱河市灸蟆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌亲族,老刑警劉巖炒考,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異霎迫,居然都是意外死亡斋枢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門知给,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓤帚,“玉大人,你說我怎么就攤上這事涩赢「甏危” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵筒扒,是天一觀的道長怯邪。 經(jīng)常有香客問我,道長花墩,這世上最難降的妖魔是什么悬秉? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮冰蘑,結(jié)果婚禮上和泌,老公的妹妹穿的比我還像新娘。我一直安慰自己允跑,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布聋丝。 她就那樣靜靜地躺著工碾,像睡著了一般弱睦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渊额,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天况木,我揣著相機與錄音旬迹,去河邊找鬼。 笑死奔垦,一個胖子當(dāng)著我的面吹牛屹耐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播椿猎,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惶岭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了按灶?” 一聲冷哼從身側(cè)響起筐咧,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎量蕊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體危融,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年辞居,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛋勺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡贼陶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碉怔,到底是詐尸還是另有隱情烘贴,我是刑警寧澤撮胧,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布芹啥,位于F島的核電站锻离,受9級特大地震影響墓怀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜傀履,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一啤呼、第九天 我趴在偏房一處隱蔽的房頂上張望卧秘。 院中可真熱鬧官扣,春花似錦、人聲如沸惕蹄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棒旗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铣揉,已是汗流浹背餐曹。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留台猴,地道東北人俱两。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓曹步,卻偏偏與公主長得像,于是被迫代替她去往敵國和親箭窜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 相關(guān)文章Java并發(fā)編程(一)線程定義、狀態(tài)和屬性 Java并發(fā)編程(二)同步Java并發(fā)編程(三)volatil...
    劉望舒閱讀 5,235評論 1 31
  • layout: posttitle: 《Java并發(fā)編程的藝術(shù)》筆記categories: Javaexcerpt...
    xiaogmail閱讀 5,817評論 1 19
  • 阻塞隊列(BlockingQueue)是一個支持兩個附加操作的隊列。這兩個附加的操作是:在隊列為空時尚骄,獲取元素的線...
    端木軒閱讀 1,004評論 0 2
  • 一陣涼風(fēng)飄過,細(xì)細(xì)的雨竟纏綿而來憨闰。正如那場需五,沒有約定的故事鹉动,只有一份從心底悠然而來的歡喜宏邮。云低垂,...
    不惑而歌閱讀 315評論 20 30
  • 聆聽內(nèi)心
    黎_kim閱讀 220評論 0 0