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