[150511]java中BlockingQueue 的使用

import java.util.concurrent.ArrayBlockingQueue;

import java.util.concurrent.BlockingQueue;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

 

/**

   本例介紹一個特殊的隊列:BlockingQueue,如果BlockQueue是空的,BlockingQueue取東西的操作將會被阻斷進入等待狀態,直到BlockingQueue進了東西纔會被喚醒.同樣,如果BlockingQueue是滿的,任何試圖往裏存東西的操作也會被阻斷進入等待狀態,直到BlockingQueue裏有空間纔會被喚醒繼續操作.

   本例再次實現11.4線程----條件Condition中介紹的籃子程序,不過這個籃子中最多能放的蘋果數不是1,可以隨意指定.當籃子滿時,生產者進入等待狀態,當籃子空時,消費者等待.

 */

/**

   使用BlockingQueue的關鍵技術點如下:

   1.BlockingQueue定義的常用方法如下:

       1)add(anObject):anObject加到BlockingQueue,即如果BlockingQueue可以容納,則返回true,否則招聘異常

       2)offer(anObject):表示如果可能的話,anObject加到BlockingQueue,即如果BlockingQueue可以容納,則返回true,否則返回false.

       3)put(anObject):anObject加到BlockingQueue,如果BlockQueue沒有空間,則調用此方法的線程被阻斷直到BlockingQueue裏面有空間再繼續.

       4)poll(time):取走BlockingQueue裏排在首位的對象,若不能立即取出,則可以等time參數規定的時間,取不到時返回null

       5)take():取走BlockingQueue裏排在首位的對象,BlockingQueue爲空,阻斷進入等待狀態直到Blocking有新的對象被加入爲止

   2.BlockingQueue有四個具體的實現類,根據不同需求,選擇不同的實現類

       1)ArrayBlockingQueue:規定大小的BlockingQueue,其構造函數必須帶一個int參數來指明其大小.其所含的對象是以FIFO(先入先出)順序排序的.

       2)LinkedBlockingQueue:大小不定的BlockingQueue,若其構造函數帶一個規定大小的參數,生成的BlockingQueue有大小限制,若不帶大小參數,所生成的BlockingQueue的大小由Integer.MAX_VALUE來決定.其所含的對象是以FIFO(先入先出)順序排序的

       3)PriorityBlockingQueue:類似於LinkedBlockQueue,但其所含對象的排序不是FIFO,而是依據對象的自然排序順序或者是構造函數的Comparator決定的順序.

       4)SynchronousQueue:特殊的BlockingQueue,對其的操作必須是放和取交替完成的.

   3.LinkedBlockingQueueArrayBlockingQueue比較起來,它們背後所用的數據結構不一樣,導致LinkedBlockingQueue的數據吞吐量要大於ArrayBlockingQueue,但在線程數量很大時其性能的可預見性低於ArrayBlockingQueue.         

 */

publicclass BlockingQueueTest {

      /**定義裝蘋果的籃子*/

      publicstaticclass Basket{

             //籃子,能夠容納3個蘋果

              BlockingQueue<String>basket =new ArrayBlockingQueue<String>(3);

             //生產蘋果,放入籃子

             publicvoid produce()throws InterruptedException{

                    //put方法放入一個蘋果,basket滿了,等到basket有位置

                    basket.put("An apple");

              }

             //消費蘋果,從籃子中取走

             public String consume()throws InterruptedException{

                    //take方法取出一個蘋果,basket爲空,等到basket有蘋果爲止

                    returnbasket.take();

              }

       }

      //測試方法

      publicstaticvoid testBasket(){

             final Basket basket =new Basket();//建立一個裝蘋果的籃子

             //定義蘋果生產者

             class Producerimplements Runnable{

                    publicvoid run(){

                           try{

                                  while(true){

                                         //生產蘋果

                                          System.out.println("生產者準備生產蘋果: " + System.currentTimeMillis());

                                          basket.produce();

                                          System.out.println("生產者生產蘋果完畢: " + System.currentTimeMillis());

                                         //休眠300ms

                                          Thread.sleep(300);

                                   }

                            }catch(InterruptedException ex){

                            }

                     }

              }

             //定義蘋果消費者

             class Consumerimplements Runnable{

                    publicvoid run(){

                           try{

                                  while(true){

                                         //消費蘋果

                                          System.out.println("消費者準備消費蘋果: " + System.currentTimeMillis());

                                          basket.consume();

                                          System.out.println("消費者消費蘋果完畢: " + System.currentTimeMillis());

                                         //休眠1000ms

                                          Thread.sleep(1000);

                                   }

                            }catch(InterruptedException ex){

                            }

                     }

              }

              ExecutorService service = Executors.newCachedThreadPool();

              Producer producer =new Producer();

              Consumer consumer =new Consumer();

              service.submit(producer);

              service.submit(consumer);

             //程序運行5s,所有任務停止

             try{

                     Thread.sleep(5000);

              }catch(InterruptedException ex){

              }

              service.shutdownNow();

       }

      publicstaticvoid main(String[] args){

              BlockingQueueTest.testBasket();

       }

}

發佈了7 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章