1. 程式人生 > >java併發包訊息佇列及在開源軟體中的應用

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,

否則返回false.

     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.