隨筆-59  評論-31  文章-0  trackbacks-0
          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.LinkedBlockingQueue和ArrayBlockingQueue比較起來,它們背后所用的數據結構不一樣,導致LinkedBlockingQueue的數據吞吐量要大于ArrayBlockingQueue,但在線程數量很大時其性能的可預見性低于ArrayBlockingQueue.         
           
          */
          public class BlockingQueueTest {
                 /**定義裝蘋果的籃子*/
                 public static class Basket{
                        //籃子,能夠容納3個蘋果
                        BlockingQueue<String> basket = new ArrayBlockingQueue<String>(3);
                        //生產蘋果,放入籃子
                        public void produce() throws InterruptedException{
                               //put方法放入一個蘋果,若basket滿了,等到basket有位置
                               basket.put("An apple");
                        }
                        //消費蘋果,從籃子中取走
                        public String consume() throws InterruptedException{
                               //take方法取出一個蘋果,若basket為空,等到basket有蘋果為止
                               return basket.take();
                        }
                 }
                 //測試方法
                 public static void testBasket(){
                        final Basket basket = new Basket();//建立一個裝蘋果的籃子
                        
          //定義蘋果生產者
                        class Producer implements Runnable{
                               public void run(){
                                      try{
                                             while(true){
                                                    //生產蘋果
                                                    System.out.println("生產者準備生產蘋果: " + System.currentTimeMillis());
                                                    basket.produce();
                                                    System.out.println("生產者生產蘋果完畢: " + System.currentTimeMillis());
                                                    //休眠300ms
                                                    Thread.sleep(300);
                                             }
                                      }catch(InterruptedException ex){
                                      }
                               }
                        }
                        //定義蘋果消費者
                        class Consumer implements Runnable{
                               public void 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();
                 }
                 public static void main(String[] args){
                        BlockingQueueTest.testBasket();
                 }
          }
          posted on 2012-01-06 16:32 RoyPayne 閱讀(235) 評論(0)  編輯  收藏 所屬分類: java并發
          主站蜘蛛池模板: 阿城市| 麻阳| 额尔古纳市| 遂平县| 巴林左旗| 个旧市| 维西| 泾川县| 吴堡县| 永宁县| 邵阳县| 辉县市| 长泰县| 石景山区| 改则县| 微山县| 南开区| 田东县| 霞浦县| 简阳市| 建德市| 麻栗坡县| 资兴市| 托克托县| 乐至县| 涿鹿县| 招远市| 白玉县| 汉源县| 景泰县| 辽阳市| 丰县| 广东省| 平果县| 新津县| 三亚市| 阜南县| 彰武县| 崇礼县| 德昌县| 夏津县|