/**
本例介紹一個特殊的隊列: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.
*/