简单分析及总结BlockingQueue接口下七个常用类
生活随笔
收集整理的這篇文章主要介紹了
简单分析及总结BlockingQueue接口下七个常用类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. BlockingQueue下主要有五個類ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue以及SynchronousQueue。
?
1.1 ArrayBlockingQueue內部結構還是一個Object數組,只不過相對ArrayList來說,使用了ReentrantLock而已,如下圖。
1.2 LinkedBlockingQueue內部是頭尾、單向鏈表,而LinkedList是頭尾、雙向節點,結果如下圖。
??
??
1.3 DelayQueue是一個延時阻塞隊列,內部結構是優先隊列,優先隊列根據“延時時間”進行處理。所以,DelayQueue存放的數據都得實現Delayed接口,因此DelayQueue也用上界限定通配符<? extends T>限定了泛型的上界,源碼如下。
1.4 PriorityBlockingQueue內部是一個數組,然后通過比較器或者自身實現的Comparable接口的compareTo方法進行小頂堆的排序,最終第一個元素的比較值是最小的。
1.5 SynchronousQueue內部沒有存儲元素,但是相當于只能存一個數據。當有線程需要數據(消費者)時,會判斷產生數據的線程(生產者)是否在等待,有生產者在等待說明“有一個數據”,那么消費者可以和生產者“匹配”,從而消費數據;若沒有生產者在等待,說明沒有數據,那么消費者陷入等待狀態。同理,當生產者要生產數據時,判斷是否有消費者,有消費者,那么匹配;若沒有則等待。
?
1.6 LinkedBlockingDeque實現了BlockingDeque,而BlockingDeque繼承于BlockingQueue。LinkedBlockingDeque相對于LinkedBlockingQueue來說,只是節點變為了雙向而已,如下圖。
?
1.7 LInkedTransferQueue實現了TranferQueue接口,而TranfersQueue接口繼承于BlockingQueue。相當于SynchronousQueue和LinkedBlockingQueue的結合,相對于SynchronousQueue,多了一個可以儲存的隊列,相對于LinkedBlockingQueue,又可以直接傳遞元素。內部結構是鏈表,節點Node結構如下圖。
LinkedTransferQueue大致的實現邏輯和原理:生產者和消費者通過傳入不同的變量值,標識自身“身份”,然后和隊列的head節點身份比較。對于消費者,判斷head節點是否是數據,如果是,那么直接取走數據;如果不是則將消費者作為節點添加至尾部。對于生產者,判斷head節點是否是數據,如果head不是數據,那么生產者數據給head節點消費;如果head是數據,那么將生產者作為節點放置尾部。
?
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的简单分析及总结BlockingQueue接口下七个常用类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 集合之TreeMap源码分析,简单介绍什
- 下一篇: Concurrent包下的常用并发类和普