<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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 閱讀(234) 評論(0)  編輯  收藏 所屬分類: java并發
    主站蜘蛛池模板: 成在人线AV无码免费| 国产va精品免费观看| 国产乱辈通伦影片在线播放亚洲| 亚洲国产精品无码久久| 拔擦拔擦8x华人免费久久| 亚洲精品乱码久久久久蜜桃 | 国产成人精品久久亚洲高清不卡| 在线观看免费高清视频| 亚洲国产日韩精品| 免费理论片51人人看电影| 亚洲欧美一区二区三区日产| 国产精品免费看久久久无码| 免费亚洲视频在线观看| 久久久久国产亚洲AV麻豆| 久久久久免费精品国产| 亚洲黄网在线观看| 女人18毛片特级一级免费视频| 国产亚洲精品美女久久久久久下载| 亚洲美女在线国产| 任你躁在线精品免费| 亚洲成AV人片久久| 精品国产精品久久一区免费式| 污污的视频在线免费观看| 亚洲人色婷婷成人网站在线观看 | 三级毛片在线免费观看| 亚洲美女一区二区三区| 国产免费av片在线看| 猫咪免费人成在线网站| 亚洲性猛交XXXX| 在线视频免费观看爽爽爽| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲AV色无码乱码在线观看 | 97亚洲熟妇自偷自拍另类图片| 青青草a免费线观a| 老司机午夜在线视频免费| 亚洲AV无码一区二区三区DV| 国产精品成人免费一区二区| 一个人免费观看视频在线中文 | 亚洲AV日韩AV天堂久久| 在线观看人成网站深夜免费| jizz免费一区二区三区|