<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ![](https://cdn.zimug.com/wx-zimug.png) 類`ArrayBlockingQueue`是`BlockingQueue`接口的實現類,它是**有界的**阻塞隊列,**內部使用數組存儲隊列元素**。這里的“有界”是指存儲容量存在上限,不能無限存儲元素。在同一時間內存儲容量存在著一個上限值,這個上限制在初始實例化的時候指定,之后便不能修改了。 `ArrayBlockingQueue`內部采用FIFO (First In, First Out)先進先出的方法實現隊列數據的存取,隊首的元素是在隊列中保存時間最長的元素對象,隊尾的元素是在隊列中保存時間最短的元素對象。 下面的代碼說明如何初始化一個`ArrayBlockingQueue`,并向其中添加一個對象: ~~~ BlockingQueue queue = new ArrayBlockingQueue(1024); queue.put("1"); //向隊列中添加元素 Object object = queue.take(); //從隊列中取出元素 ~~~ `BlockingQueue`可以通過泛型來限定隊列中存儲數據的類型,下面的代碼以String為泛型,表示該隊列只能存儲String類型。 ~~~ BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1024); queue.put("1"); String string = queue.take(); ~~~ ## 實現一個生產消費的實例 在前面的文章中我們曾經講過:BlockingQueue經常被用于生產消費的緩沖隊列。下面我們就使用`ArrayBlockingQueue`來真正的實現一個生產消費的例子。 類`BlockingQueueExample`開啟兩個獨立線程,一個是`Producer`生產者線程,負責向隊列中添加數據;另一個是`Consumer`消費者線程,負責從隊列中取出數據進行處理。 ~~~ public class BlockingQueueExample { public static void main(String[] args) throws Exception { //使用ArrayBlockingQueue初始化一個BlockingQueue,指定容量的上限為1024 BlockingQueue queue = new ArrayBlockingQueue(1024); Producer producer = new Producer(queue); //生產者 Consumer consumer = new Consumer(queue); //消費者 new Thread(producer).start(); //開啟生產者線程 new Thread(consumer).start(); //開啟消費者線程 Thread.sleep(4000); } } ~~~ 類`Producer`為生產者,每隔10秒鐘使用`put()`方法向隊列中放入一個對象,放入三次。在這10秒的間隔內,隊列數據被消費者取走之后將導致消費者線程阻塞。 ~~~ public class Producer implements Runnable{ protected BlockingQueue queue = null; public Producer(BlockingQueue queue) { this.queue = queue; } public void run() { try { queue.put("1"); Thread.sleep(10000); queue.put("2"); Thread.sleep(10000); queue.put("3"); } catch (InterruptedException e) { e.printStackTrace(); } } } ~~~ 下面的代碼是消費者類`Consumer`,它從隊列中獲取待處理的元素對象,并調用`System.out`將其打印出來。 ~~~ public class Consumer implements Runnable{ protected BlockingQueue queue = null; public Consumer(BlockingQueue queue) { this.queue = queue; } public void run() { try { System.out.println(queue.take()); System.out.println(queue.take()); System.out.println(queue.take()); } catch (InterruptedException e) { e.printStackTrace(); } } } ~~~ 上面的代碼打印結果是每隔10秒打印一次,因為其中`take()`方法在隊列內沒有元素可以取到的時候,會阻塞當前的消費者線程,讓其處于等待狀態,這個方法我們在上一節介紹`BlockingQueue`的時候就已經進行過說明。
                  <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>

                              哎呀哎呀视频在线观看