java併發包訊息佇列及在開源軟體中的應用
1.BlockingQueue的常用方法
BlockingQueue也是java.util.concurrent下的主要用來控制執行緒同步的工具。
主要的方法是:put、take一對阻塞存取;add、poll一對非阻塞存取。
插入:
1)add(anObject):把anObject加到BlockingQueue裡,即如果BlockingQueue可以容納,則返回true,否則丟擲
2)offer(anObject):表示如果可能的話,將anObject加到BlockingQueue裡,即如果BlockingQueue可以容納,則返回true,
3)put(anObject):把anObject加到BlockingQueue裡,如果BlockQueue沒有空間,則呼叫此方法的執行緒被阻斷直到BlockingQueue裡面有空間再繼續.
讀取:
4)poll(time):取走BlockingQueue裡排在首位的物件,若不能立即取出,則可以等time引數規定的時間,取不到時返回null
5)take():取走BlockingQueue裡排在首位的物件,若BlockingQueue為空,阻斷進入等待狀態直到Blocking有新的物件被加入為止
其他
int remainingCapacity();返回佇列剩餘的容量,在佇列插入和獲取的時候,不要瞎搞,數 據可能不準
boolean remove(Object o); 從佇列移除元素,如果存在,即移除一個或者更多,佇列改 變了返回true
public boolean contains(Object o); 檢視佇列是否存在這個元素,存在返回true
int drainTo(Collection<? super E> c); 傳入的集合中的元素,如果在佇列中存在,那麼將 佇列中的元素移動到集合中
int drainTo(Collection<? super E> c, int maxElements); 和上面方法的區別在於,制定了移 動的數量
2.BlockingQueue的實現類
BlockingQueue有四個具體的實現類,常用的兩種實現類為:
1、ArrayBlockingQueue:一個由陣列支援的有界阻塞佇列,規定大小的BlockingQueue,其建構函式必須帶一個int引數來指明其大小.其所含的物件是以FIFO(先入先出)順序排序的。
2、LinkedBlockingQueue:大小不定的BlockingQueue,若其建構函式帶一個規定大小的引數,生成的BlockingQueue有大小限制,若不帶大小引數,所生成的BlockingQueue的大小由Integer.MAX_VALUE來決定.其所含的物件是以FIFO(先入先出)順序排序的。
LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的話,預設最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在佇列滿的時候會阻塞直到有佇列成員被消費,take方法在佇列空的時候會阻塞,直到有佇列成員被放進來。
3.LinkedBlockingQueue和ArrayBlockingQueue區別
LinkedBlockingQueue和ArrayBlockingQueue比較起來,它們背後所用的資料結構不一樣,導致LinkedBlockingQueue的資料吞吐量要大於ArrayBlockingQueue,但線上程數量很大時其效能的可預見性低於ArrayBlockingQueue.