java 阻塞隊列

來源:互聯網
上載者:User

標籤:

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();       }}

原文: http://blog.csdn.net/azhao_dn/article/details/8191820

java 阻塞隊列

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.