<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并發
    主站蜘蛛池模板: 一级做a爰性色毛片免费| 免费日本一区二区| 亚洲一区二区三区无码影院| 国产综合免费精品久久久| 亚洲精品免费观看| 免费看少妇作爱视频| 中国好声音第二季免费播放| 亚洲国色天香视频| 亚洲国产天堂久久久久久| 99免费视频观看| 特黄aa级毛片免费视频播放| 国产亚洲人成网站观看| 成年女人毛片免费播放人| 女同免费毛片在线播放| 亚洲日韩一区二区三区| 亚洲国产第一站精品蜜芽| 在线精品免费视频无码的 | 久久最新免费视频| 亚洲午夜久久久久久尤物| 亚洲中文无韩国r级电影| 日本XXX黄区免费看| 男人天堂免费视频| 亚洲av永久中文无码精品综合 | 在线v片免费观看视频| 三上悠亚在线观看免费| 亚洲午夜精品一区二区麻豆| 亚洲情综合五月天| 国产嫩草影院精品免费网址| 99精品一区二区免费视频| 一级毛片大全免费播放| 在线a亚洲老鸭窝天堂av高清| 亚洲VA中文字幕不卡无码| 免费国产成人午夜私人影视| 97性无码区免费| 久9久9精品免费观看| 精品一区二区三区免费视频| 国产精品亚洲精品爽爽| 亚洲av无码电影网| 亚洲视频在线观看免费视频| 国产成人亚洲精品青草天美| 亚洲成A人片在线观看无码3D|