1. 程式人生 > >Java訊息佇列

Java訊息佇列

Java並法包訊息佇列及在開源軟體中的使用:

是什麼?

BlockingQueue也是java.util.concurrent下主要用來控制執行緒同步的工具。

為什麼?

鎖也是用來控制執行緒同步的,但是鎖這個東西有個特點,比如我有一個人搶到一把鎖,我去做事,其他人都要等待,然後當我把這把鎖釋放的瞬間,那些等待的人到底時誰拿到鎖,這個沒有順序預測,完全靠運氣,拿鎖的順序不可以控制。

怎麼辦?

我們用訊息佇列就可以做這個事情,我有一些任務要執行,我就把任務丟到佇列裡面去,有一個執行緒拿走一個任務,那麼下一個執行緒拿走一定是下一個任務,所以我們的任務時可以按順序執行。

兩種阻塞可能:

①訊息佇列是同步阻塞,就是我往裡面放東西的時候,別人就不能放;我從裡面取東西的時候,別人就不能取。(著重點:

在放或取的那一刻,相當於對訊息佇列加了同步鎖)

我的Queue(訊息佇列)滿的時候,就不能在push了,要等別人從佇列裡把東西取走。其實訊息都列對阻塞存取也可以,對非阻塞存取也可以。(著重點:Queue(訊息佇列)滿的時候,即不能在插入的時候,這個時候,是可以由使用者決定是阻塞等待空間,還是繼續執行其他操作)

主要方法:

puttake                一對阻塞存取(即當佇列為空的時候或滿的時候,會等待空間)

addpoll(time)    一對非阻塞存取(即當佇列滿的時候,丟擲異常並且該執行緒中斷;當佇列為空的時候,可以等待規定時間內,仍取不到數後停止等待,繼續執行帶執行緒後面

的操作)

插入:

     1add(anObject):anObject加到BlockingQueue裡面,即BlockingQueue可以容納就返回true,否則丟擲異常。

     2offer(anObject):anObject加到BlockingQueue裡面,即BlockingQueue可以容納就返回true,否則返回false

     3put(anObject):anObject加到BlockingQueue裡面,如果BlockingQueue沒有空間,則等待,直到BlockingQueue有空間再繼續。

讀取:

     1poll(time):取走BlockingQueue

隊首的物件,如果不能立即取出,則等待time引數規定時間,再取不走時返回null

     2take():取走BlockingQueue隊首的物件,BlockingQueue為空,則阻塞,一直等到拿到東西才走。

其他:

     1int remainingCapacity():返回佇列剩餘容量,如果正好有資料再插入或者取出的時候,這個資料就可能不準。

     2boolean remove(Object o):從佇列裡面移除元素,如果存在,即移除一個或者多個。佇列改變了返回true

     3public boolean contain(Object o):檢視佇列是否存在這個元素,存在返回true

     4int drainTo(Collection<? supper E> c):移除佇列裡面所有可用的元素,並將他們新增到collection中。

     5int drainTo(Collection<? supper E> c, int maxElements):規定了移除的最大maxElements個元素。

BlockingQueue有四個具體的實現類,常用的有:

ArrayBlockingQueue:是基於一個數組,再構造的時候傳入一個int,確定陣列的大小。

LinkedBlockingQueue:構造的時候不傳int的時候,預設有Integer.MAX_VALUE那麼大。