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