Java中的阻塞隊列(1)

隊列(Queue):FIFO

雙端隊列(Deque):兩端都可以進出颜价,當我們約束從隊列的一端進出隊列時,就形成了一種存取模式,它遵循先進后出的原則彬向,就是所謂棧結構

阻塞隊列(BlockingQueue):在隊列的基礎上附加了兩個操作,1:在隊列為空時攻冷,獲取元素的線程會等待隊列變?yōu)榉强胀薜ǎ划旉犃袧M時,存儲元素的線程會等待隊列可用等曼,阻塞隊列常用于生產(chǎn)者和消費者場景

1里烦、阻塞隊列:BlockingQueue(T),所有的阻塞隊列的父接口

? ? 首先是接口的繼承關系如圖1-1禁谦,這里可以清楚的看到BlockingQueue隊列其實本質上可以認為是一個集合

圖1-1

常用方法:

? ? (1):add胁黑,添加到隊列里面,如果可以容納州泊,返回true丧蘸,否則直接拋出異常

????(2):offer,表示將元素添加到隊列中遥皂,可以容納返回true力喷,否則返回false

? ? (3):put刽漂,把元素添加到隊列,如果沒有空間弟孟,則阻塞線程

? ? (4):poll贝咙,取走排在首位的對象,如果不能立即取走拂募,則等待入?yún)⒌臅r間庭猩,到時直接返回null

? ? (5):take,取走排在首位的對象没讲,如果為空眯娱,則阻塞隊列,直到有新的對象被加入

? ? 注意:BlockingQueue中不接受null元素爬凑,如果試圖添加一個null的時候徙缴,有可能會拋出空指針異常

2、數(shù)組阻塞隊列ArrayBlockingQueue

? ? 是一個由數(shù)組支持的有界的阻塞隊列FIFO嘁信,從結構來看如圖2-1于样,是一個阻塞隊列,實現(xiàn)方式就是簡單的數(shù)組潘靖,這個一樣也具有數(shù)組的特性穿剖,比較突出的一點就是一旦初始化過后,就無法再進行擴容

圖2-1

3卦溢、鏈表阻塞隊列LinkedBlockingQueue

? ? 基于鏈表的阻塞隊列糊余,結構圖如下圖3-1

圖3-1

我們可以看出,鏈表阻塞隊列和數(shù)組阻塞隊列結構基本相同单寂,從實現(xiàn)方式來看贬芥,

對比數(shù)組隊列和鏈表隊列異同點:

? ? 1).隊列大小有所不同,ArrayBlockingQueue是有界的初始化必須指定大小宣决,而LinkedBlockingQueue可以是有界的也可以是無界的(Integer.MAX_VALUE)蘸劈,對于后者而言,當添加速度大于移除速度時尊沸,在無界的情況下威沫,可能會造成內存溢出等問題。

? ? 2).數(shù)據(jù)存儲容器不同洼专,ArrayBlockingQueue采用的是數(shù)組作為數(shù)據(jù)存儲容器棒掠,而LinkedBlockingQueue采用的則是以Node節(jié)點作為連接對象的鏈表。

????3).由于ArrayBlockingQueue采用的是數(shù)組的存儲容器,因此在插入或刪除元素時不會產(chǎn)生或銷毀任何額外的對象實例,而LinkedBlockingQueue則會生成一個額外的Node對象灶芝。這可能在長時間內需要高效并發(fā)地處理大批量數(shù)據(jù)的時霞篡,對于GC可能存在較大影響玛追。

????4).兩者的實現(xiàn)隊列添加或移除的鎖不一樣但两,ArrayBlockingQueue實現(xiàn)的隊列中的鎖是沒有分離的胳施,即添加操作和移除操作采用的同一個ReenterLock鎖奇适,而LinkedBlockingQueue實現(xiàn)的隊列中的鎖是分離的谜酒,其添加采用的是putLock叹俏,移除采用的則是takeLock,這樣能大大提高隊列的吞吐量僻族,也意味著在高并發(fā)的情況下生產(chǎn)者和消費者可以并行地操作隊列中的數(shù)據(jù)粘驰,以此來提高整個隊列的并發(fā)性能。

4述么、優(yōu)先級阻塞隊列PriorityBlockingQueue

? ? 首先先查看結構蝌数,如圖4-1

圖4-1

? ? 優(yōu)先級阻塞隊列是一個支持優(yōu)先級排序的無界阻塞隊列,優(yōu)先級的判斷通過構造方法傳入的Compator對象來決定度秘,如果通過這個排序構造進行創(chuàng)建對象顶伞,生產(chǎn)的數(shù)據(jù)會排列好放入隊列中。

????PriorityBlockingQueue是基于數(shù)組方式的隊列剑梳,因為排序需要大量的查詢操作唆貌,所以此處通過數(shù)組的方式,查詢排序速度足夠快垢乙,但是因為數(shù)組是有限的锨咙,而PriorityBlockingQueue是無界的,所以中間還需要進行數(shù)組的擴容算法追逮。

? ? 要注意一點酪刀,PriorityBlockingQueue并不會阻塞生產(chǎn)者,只會阻塞消費者钮孵,所以生產(chǎn)者的生產(chǎn)速度絕對不能超過消費者的消費速度骂倘,否則容易內存溢出

? ? 5、延時隊列DelayQueue

????DelayQueue是一個支持延時獲取元素的使用優(yōu)先級隊列的實現(xiàn)的無界阻塞隊列

? ? 在創(chuàng)建元素的時候可以制定多久才能從隊列中獲取當前元素油猫,只有在延遲期滿時才能從隊列中提取元素,一個比較典型的應用場景就是定時任務調度柠偶,生產(chǎn)者將需要執(zhí)行的任務添加到隊列中情妖,時間到之后,消費者從隊列中獲取任務開始執(zhí)行诱担;除了這個我們還可以逆向思維來作為緩存定時任務毡证,就是在把緩存數(shù)據(jù)放入內存中的同時,也把數(shù)據(jù)放入隊列中蔫仙,并添加緩存的時效時間料睛,一旦到達時間,消費者從隊列中讀取到緩存,然后把讀取到的隊列充緩存中刪除恤煞,這樣就可以起到緩存定時的作用屎勘。

????首先看一下DelayQueue的結構,如圖5-1

圖5-1

? ? 從源碼來看居扒,DelayQueue是在PriorityBlockingQueue的基礎上進行擴展 ;

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末概漱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子喜喂,更是在濱河造成了極大的恐慌瓤摧,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玉吁,死亡現(xiàn)場離奇詭異照弥,居然都是意外死亡,警方通過查閱死者的電腦和手機进副,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門这揣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人敢会,你說我怎么就攤上這事曾沈。” “怎么了鸥昏?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵塞俱,是天一觀的道長。 經(jīng)常有香客問我吏垮,道長障涯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任膳汪,我火速辦了婚禮唯蝶,結果婚禮上,老公的妹妹穿的比我還像新娘遗嗽。我一直安慰自己粘我,他們只是感情好,可當我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布痹换。 她就那樣靜靜地躺著征字,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娇豫。 梳的紋絲不亂的頭發(fā)上匙姜,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天,我揣著相機與錄音冯痢,去河邊找鬼氮昧。 笑死框杜,一個胖子當著我的面吹牛,可吹牛的內容都是我干的袖肥。 我是一名探鬼主播咪辱,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昭伸!你這毒婦竟也來了梧乘?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤庐杨,失蹤者是張志新(化名)和其女友劉穎选调,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灵份,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡仁堪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了填渠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弦聂。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氛什,靈堂內的尸體忽然破棺而出莺葫,到底是詐尸還是另有隱情,我是刑警寧澤枪眉,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布捺檬,位于F島的核電站,受9級特大地震影響贸铜,放射性物質發(fā)生泄漏堡纬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一蒿秦、第九天 我趴在偏房一處隱蔽的房頂上張望烤镐。 院中可真熱鬧,春花似錦棍鳖、人聲如沸炮叶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镜悉。三九已至,卻和暖如春骂蓖,著一層夾襖步出監(jiān)牢的瞬間积瞒,已是汗流浹背川尖。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工登下, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茫孔,地道東北人。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓被芳,卻偏偏與公主長得像缰贝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子畔濒,可洞房花燭夜當晚...
    茶點故事閱讀 43,499評論 2 348

推薦閱讀更多精彩內容

  • 相關文章Java并發(fā)編程(一)線程定義剩晴、狀態(tài)和屬性 Java并發(fā)編程(二)同步Java并發(fā)編程(三)volatil...
    劉望舒閱讀 5,231評論 1 31
  • 阻塞隊列(BlockingQueue)是一個支持兩個附加操作的隊列。這兩個附加的操作是:在隊列為空時侵状,獲取元素的線...
    端木軒閱讀 1,000評論 0 2
  • 2015.12.14趣兄,全國小微民辦學校聯(lián)盟在黃河之濱的長垣縣步步高學校拉開了共同發(fā)展绽左,公益同行的序幕。鄭...
    大樹媽媽閱讀 371評論 0 0
  • 歲月如一剪流沙劃落于匆匆一指間,轉眼已過暮秋蹋凝,笑看花開花落鲁纠,云淡風輕間已是淺冬。北方的天氣已有些寒氣凜然了鳍寂,天空亦...
    落筆成傷閱讀 718評論 0 3
  • 一改含、簡介 地理位置特性能夠識別你所在的地理位置并且在你允許的情況下,把位置信息分享給別人伐割。 識別地理位置的方法: ...
    destiny0904閱讀 481評論 0 0