<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] > 本文視頻講解:https://www.bilibili.com/video/BV1Lb4y1d7L7 ## 什么是阻塞隊列 阻塞隊列是一個在隊列基礎上又支持了兩個附加操作的隊列,常應用于解耦。 兩個附加操作: 1. 支持阻塞的插入方法:隊列滿時,隊列會阻塞插入元素的線程,直到隊列不滿。 2. 支持阻塞的移除方法:隊列空時,獲取元素的線程會等待隊列變為非空。 阻塞隊列是哪里用到的?阻塞隊列是線程池的自定義參數之一。<br> 和JDK集合包中的Queue接兼容,同時在其基礎上增加了阻塞功能。 定義的接口,而pu(.)是阻塞的。 ### 說一下JUC中BlockingQueue接口主要的方法和特點? 條件: notEmpty:非空狀態,take()線程可以在隊列中取數據; notFull:未滿裝填,put()線程可以在隊列中放數據; #### 說一說BlockingQueue常 用的實現類? **說一下ArrayBlockingQueue的設計?** > 一個對象數組 + 一把鎖 + 兩個條件 是一個用數組實現的有界阻塞隊列,此隊列按照先進先出(FIFO)的原則對元素進行排序。支持公平鎖和非公平鎖。 1. ArrayBlockingQueue是一個用數組實現的環形隊列,在構造方法中,會要求傳入數組的容量。 2. 入隊與出隊都用同一把鎖只有入隊高并發或出隊高并發的情況下,操作數組不需要擴容,性能很高。 > 注:每一個線程在獲取鎖的時候可能都會排隊等待,如果在等待時間上,先獲取鎖的線程的請求一定先被滿足,那么這個鎖就是公平的。反之,這個鎖就是不公平的。公平的獲取鎖,也就是當前等待時間最長的線程先獲取鎖 ##### 說一下LinkedBlockingQueue的設計? ``` public class LinkedBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { /** The capacity bound, or Integer.MAX_VALUE if none */ private final int capacity; /** Current number of elements */ private final AtomicInteger count = new AtomicInteger(); /** * Head of linked list. * Invariant: head.item == null */ transient Node<E> head; /** * Tail of linked list. * Invariant: last.next == null */ private transient Node<E> last; /** Lock held by take, poll, etc */ private final ReentrantLock takeLock = new ReentrantLock(); /** Wait queue for waiting takes */ private final Condition notEmpty = takeLock.newCondition(); /** Lock held by put, offer, etc */ private final ReentrantLock putLock = new ReentrantLock(); /** Wait queue for waiting puts */ private final Condition notFull = putLock.newCondition(); …… } ``` - 兩把鎖:put()操作和take()操作,分別對應一把鎖,本質上操作的是Node對象; - 相互通知:put()線程未滿,通知其他put()線程,會通知take()線程; ##### 說-下PriorityBlockingQueue的設計? #### SynchronousQueue ![](https://img.kancloud.cn/1f/90/1f9086d453fd2c3a2cbee8a865e20119_1136x362.png) SynchronousQueue: 一個不存儲元素的阻塞隊列,每一個put()操作必須等待take()操作,否則不能添加元素。支持公平鎖和非公平鎖。SynchronousQueue的一個使用場景是在線程池里。Executors.newCachedThreadPool()就使用了SynchronousQueue,這個線程池根據需要(新任務到來時)創建新的線程,如果有空閑線程則會重復使用,線程空閑了60秒后會被回收。 ### 應用場景 ## 總結 ![](https://img.kancloud.cn/03/f0/03f0767de4929e3c4a2bea3c5041af75_909x465.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看