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

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

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

    Cyh的博客

    Email:kissyan4916@163.com
    posts - 26, comments - 19, trackbacks - 0, articles - 220

    線程--BlockingQueue

    Posted on 2009-12-24 21:59 啥都寫點 閱讀(1035) 評論(0)  編輯  收藏 所屬分類: J2SE
           本例介紹一個特殊的隊列:BlockingQueue,如果BlockingQueue是空的,從BlockingQueue取東西的操作將會被阻斷進入等待狀態,直到BlockingQueue進了東西才會被喚醒,同樣,如果BlockingQueue是滿的,任何試圖往里存東西的操作也會被阻斷進入等待狀態,直到BlockingQueue里有空間時才會被喚醒繼續操作。
           本例再次實現前面介紹的籃子程序,不過這個籃子中最多能放得蘋果數不是1,可以隨意指定。當籃子滿時,生產者進入等待狀態,當籃子空時,消費者等待。

           BlockingQueue定義的常用方法如下:
                    add(anObject):把anObject加到BlockingQueue里,如果BlockingQueue可以容納,則返回true,否則拋出異常。
                    offer(anObject):表示如果可能的話,將anObject加到BlockingQueue里,即如果BlockingQueue可以容納,則返回true,否則返回false。
                    put(anObject):把anObject加到BlockingQueue里,如果BlockingQueue沒有空間,則調用此方法的線程被阻斷直到BlockingQueue里有空間再繼續。
                    poll(time):取走BlockingQueue里排在首位的對象,若不能立即取出,則可以等time參數規定的時間,取不到時返回null。
                    take():取走BlockingQueue里排在首位的對象,若BlockingQueue為空,阻斷進入等待狀態直到BlockingQueue有新的對象被加入為止。

           BlockingQueue有四個具體的實現類,根據不同需求,選擇不同的實現類:
                    ArrayBlockingQueue:規定大小的BlockingQueue,其構造函數必須帶一個int參數來指明其大小。其所含的對象是以FIFO(先入先出)順序排序的。
                    LinkedBlockingQueue:大小不定的BlockingQueue,若其構造函數帶一個規定大小的參數,生成的BlockingQueue有大小限制,若不帶大小參數,所生成的BlockingQueue的大小由Integer.MAX_VALUE來決定。其所含的對象是以FIFO順序排序的。
                    PriorityBlockingQueue:類似于LinkedBlockingQueue,但其所含對象的排序不是FIFO,而是依據對象的自然排序順序或者是構造函數所帶的Comparator決定的順序。
                    SynchronousQueue:特殊的BlockingQueue,對其的操作必須是放和取交替完成的。

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


    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;

    /**
     * BlockingQueue是一種特殊的Queue,若BlockingQueue是空的,
     * 從BlockingQueue取東西的操作將會被阻斷進入等待狀態直到BlocingkQueue進了新貨才會被喚醒。
     * 同樣,如果BlockingQueue是滿的任何試圖往里存東西的操作也會被阻斷進入等待狀態,
     * 直到BlockingQueue里有新的空間才會被喚醒繼續操作。
     * BlockingQueue提供的方法主要有:
     * add(anObject): 把anObject加到BlockingQueue里,如果BlockingQueue可以容納返回true,否則拋出IllegalStateException異常。 
     * offer(anObject):把anObject加到BlockingQueue里,如果BlockingQueue可以容納返回true,否則返回false。 
     * put(anObject):把anObject加到BlockingQueue里,如果BlockingQueue沒有空間,調用此方法的線程被阻斷直到BlockingQueue里有新的空間再繼續。 
     * poll(time):取出BlockingQueue里排在首位的對象,若不能立即取出可等time參數規定的時間。取不到時返回null。 
     * take():取出BlockingQueue里排在首位的對象,若BlockingQueue為空,阻斷進入等待狀態直到BlockingQueue有新的對象被加入為止。
     * 
     * 根據不同的需要BlockingQueue有4種具體實現:
     * (1)ArrayBlockingQueue:規定大小的BlockingQueue,其構造函數必須帶一個int參數來指明其大小。其所含的對象是以FIFO(先入先出)順序排序的。 
     * (2)LinkedBlockingQueue:大小不定的BlockingQueue,若其構造函數帶一個規定大小的參數,生成的BlockingQueue有大小限制,
     * 若不帶大小參數,所生成的BlockingQueue的大小由Integer.MAX_VALUE來決定。其所含的對象是以FIFO(先入先出)順序排序的。
     * LinkedBlockingQueue和ArrayBlockingQueue比較起來,它們背后所用的數據結構不一樣,
     * 導致LinkedBlockingQueue的數據吞吐量要大于ArrayBlockingQueue,但在線程數量很大時其性能的可預見性低于ArrayBlockingQueue。 
     * (3)PriorityBlockingQueue:類似于LinkedBlockingQueue,但其所含對象的排序不是FIFO,而是依據對象的自然排序順序或者是構造函數所帶的Comparator決定的順序。 
     * (4)SynchronousQueue:特殊的BlockingQueue,對其的操作必須是放和取交替完成的。
     * 
     * 下面是用BlockingQueue來實現Producer和Consumer的例子
     
    */

    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{
                
    // get方法取出一個蘋果,若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 e) {
            }

            service.shutdownNow();
        }


        
    public static void main(String[] args) {
            BlockingQueueTest.testBasket();
        }

    }




                                                                                                           --    學海無涯
            

    主站蜘蛛池模板: 大地资源免费更新在线播放| 亚洲国产精品无码久久青草| 亚洲欧好州第一的日产suv| 国产成人精品男人免费| 在线观看黄片免费入口不卡| 亚洲国产美女福利直播秀一区二区| 麻豆国产VA免费精品高清在线| 中文字幕免费观看视频| ass亚洲**毛茸茸pics| 亚洲国产成人爱av在线播放| 99re在线视频免费观看| 色噜噜的亚洲男人的天堂| 久久久久亚洲AV成人片| 全部免费毛片在线| 亚洲成人免费网址| 成人男女网18免费视频| 十八禁在线观看视频播放免费| 涩涩色中文综合亚洲| 亚洲国产精品不卡在线电影| 国产成人高清精品免费鸭子| 99精品免费观看| 一个人免费观看视频在线中文 | 伊人久久综在合线亚洲2019| 日本特黄特黄刺激大片免费| 日本免费大黄在线观看| 香港经典a毛片免费观看看| 亚洲毛片基地日韩毛片基地| 亚洲综合区小说区激情区| 中文字幕无码免费久久99| 国内精品久久久久影院免费| 免费人成又黄又爽的视频在线电影| 亚洲另类春色校园小说| 亚洲动漫精品无码av天堂| 国产jizzjizz免费看jizz| 麻豆一区二区免费播放网站| 久久免费视频观看| jizz免费在线观看| 国产亚洲精彩视频| 亚洲色大成网站www永久网站| 精品亚洲aⅴ在线观看| 亚洲妇熟XXXX妇色黄|