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());// 休眠300msThread.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());// 休眠1000msThread.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();}}