摘要:是線程安全的存取隊(duì)列,繼承了。接口插入方法阻塞隊(duì)列滿了,拋出異常。如果隊(duì)列不為空,返回頭結(jié)點(diǎn)但不刪除,如果隊(duì)列為空,返回子類一個由數(shù)組結(jié)構(gòu)組成的有界阻塞隊(duì)列。一個由鏈表結(jié)構(gòu)組成的有界阻塞隊(duì)列。一個支持優(yōu)先級排序的無界阻塞隊(duì)列。
BlockingQueue
BlockingQueue是線程安全的存取隊(duì)列,繼承了Queue。
使用場景消費(fèi)者生產(chǎn)者模式。
生產(chǎn)者,一直會往隊(duì)列里扔數(shù)據(jù),直到隊(duì)列滿了,開始阻塞,等待消費(fèi)者取數(shù)據(jù)。
消費(fèi)者,一直會從隊(duì)列里取數(shù)據(jù),直到隊(duì)列空了,開始阻塞,等待生產(chǎn)者扔數(shù)據(jù)。
接口 插入方法add:阻塞隊(duì)列滿了,拋出IllegalStateException異常。成功返回true。
offer:插入成功,返回true,插入失敗,返回false。
put:阻塞隊(duì)列滿了,就等到,可被中斷,拋出InterruptedException異常
移除方法remove:成功返回true,為空拋出NoSuchElementException異常
poll:如果隊(duì)列不為空,移除并返回頭結(jié)點(diǎn),如果隊(duì)列為空,返回null
take:如果隊(duì)列不為空,移除并返回頭結(jié)點(diǎn),如果隊(duì)列為空,則等待,可被中斷,拋出InterruptedException異常
檢查方法:element:如果隊(duì)列不為空,返回頭結(jié)點(diǎn)但不刪除,如果隊(duì)列為空,拋出NoSuchElementException異常。
peek:如果隊(duì)列不為空,返回頭結(jié)點(diǎn)但不刪除,如果隊(duì)列為空,返回null
子類ArrayBlockingQueue:一個由數(shù)組結(jié)構(gòu)組成的有界阻塞隊(duì)列。
LinkedBlockingQueue:一個由鏈表結(jié)構(gòu)組成的有界阻塞隊(duì)列。
PriorityBlockingQueue:一個支持優(yōu)先級排序的無界阻塞隊(duì)列。
DelayQueue:一個使用優(yōu)先級排序?qū)崿F(xiàn)的無界阻塞隊(duì)列。
SynchronousQueue:一個不存儲元素的阻塞隊(duì)列。
LinkedTransferQueue:一個由鏈表結(jié)構(gòu)組成的無界阻塞隊(duì)列。
LinkedBlockingDeque:一個由鏈表結(jié)構(gòu)組成的雙向阻塞隊(duì)列。
ArrayBlockingQueue先進(jìn)先出,初始化必須給數(shù)組大小,只有一個鎖。
LinkedBlockingQueue先進(jìn)先出,初始化沒有給鏈表帶下,默認(rèn)為Integer.MAX_VALUE,有兩個鎖。
PriorityBlockingQueue可以直接通過Comparator或者Collection的Comparator進(jìn)行排序,一個鎖。
DelayQueueDelayQueue中的對象必須實(shí)現(xiàn)Delayed接口,延時取元素。
使用場景:
訂單到期未付款,取消訂單
刪除過期的緩存
SynchronousQueue因?yàn)椴淮鎯?shù)據(jù),所以每一次put,都要等待一個take。
LinkedTransferQueue先進(jìn)先出,如果消費(fèi)者在等待接收元素,transfer方法把元素直接給消費(fèi)者,如果沒有,則放對隊(duì)列的尾節(jié)點(diǎn),并等到消費(fèi)結(jié)束后返回。tryTransfer無論消費(fèi)者是否消費(fèi),都直接返回。
LinkedBlockingDeque頭部和尾部,都可以添加或移除元素。工作密取,就是用這個
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/75681.html
摘要:是所有線程池實(shí)現(xiàn)的父類,我們先看看構(gòu)造函數(shù)構(gòu)造參數(shù)線程核心數(shù)最大線程數(shù)線程空閑后,存活的時間,只有線程數(shù)大于的時候生效存活時間的單位任務(wù)的阻塞隊(duì)列創(chuàng)建線程的工程,給線程起名字當(dāng)線程池滿了,選擇新加入的任務(wù)應(yīng)該使用什么策略,比如拋異常丟棄當(dāng)前 ThreadPoolExecutor ThreadPoolExecutor是所有線程池實(shí)現(xiàn)的父類,我們先看看構(gòu)造函數(shù) 構(gòu)造參數(shù) corePool...
摘要:原理全稱,當(dāng)線程去獲取資源的時候,會根據(jù)狀態(tài)值來判斷是否有鎖,如果有鎖,則加入到鏈表,鏈表里的線程,通過自旋,判斷資源是否已經(jīng)釋放,如果釋放,則獲取資源。 原理 全稱AbstractQueuedSynchronizer,當(dāng)線程去獲取資源的時候,會根據(jù)狀態(tài)值state來判斷是否有鎖,如果有鎖,則加入到鏈表,鏈表里的線程,通過自旋,判斷資源是否已經(jīng)釋放,如果釋放,則獲取資源。 AQS結(jié)構(gòu) ...
摘要:顯示鎖和內(nèi)置鎖內(nèi)置鎖優(yōu)勢代碼簡潔不會因?yàn)闆]釋放鎖,導(dǎo)致鎖泄露。顯示鎖優(yōu)勢靈活性強(qiáng),鎖的獲取可以被中斷,可以嘗試獲取鎖。接口接口主要方法如下獲取鎖嘗試獲取鎖,表示未加鎖的情況。會進(jìn)行搶鎖操作,如果獲取不到鎖,也會進(jìn)入阻塞隊(duì)列等到喚醒。 顯示鎖和內(nèi)置鎖 內(nèi)置鎖(Synchronized)優(yōu)勢 代碼簡潔 不會因?yàn)闆]釋放鎖,導(dǎo)致鎖泄露。 顯示鎖(Lock)優(yōu)勢 靈活性強(qiáng),鎖的獲取可以被中...
摘要:之前中提過,并發(fā)的時候,可能造成死循環(huán),那么在多線程中可以用來避免這一情況。默認(rèn),當(dāng)容量大于時,開始擴(kuò)容并發(fā)數(shù),默認(rèn),直接影響和的值,以及的初始化數(shù)量。初始化的數(shù)量,為最接近且大于的辦等于的次方的值,比如,數(shù)量為,,數(shù)量為。 之前HashMap中提過,并發(fā)的時候,可能造成死循環(huán),那么在多線程中可以用ConcurrentHashMap來避免這一情況。 Segment Concurrent...
摘要:思想把大任務(wù)分割成多個小任務(wù),再把小任務(wù)的結(jié)果匯總,最終得到大任務(wù)的結(jié)果。當(dāng)一個線程執(zhí)行完當(dāng)前隊(duì)列的任務(wù)時,他就會去竊取其他隊(duì)列的任務(wù)來執(zhí)行。當(dāng)雙端隊(duì)列只有一個任務(wù)時,線程之間會競爭。 思想 把大任務(wù)分割成多個小任務(wù),再把小任務(wù)的結(jié)果匯總,最終得到大任務(wù)的結(jié)果。 步驟如下: 任務(wù)分割 結(jié)果匯總 示例圖 showImg(https://segmentfault.com/img/bVb...
閱讀 1756·2021-11-18 10:02
閱讀 2270·2021-11-15 11:38
閱讀 2729·2019-08-30 15:52
閱讀 2265·2019-08-29 14:04
閱讀 3288·2019-08-29 12:29
閱讀 2134·2019-08-26 11:44
閱讀 1059·2019-08-26 10:28
閱讀 900·2019-08-23 18:37