Java訊息佇列
Java並法包訊息佇列及在開源軟體中的使用:
是什麼?
BlockingQueue也是java.util.concurrent下主要用來控制執行緒同步的工具。
為什麼?
鎖也是用來控制執行緒同步的,但是鎖這個東西有個特點,比如我有一個人搶到一把鎖,我去做事,其他人都要等待,然後當我把這把鎖釋放的瞬間,那些等待的人到底時誰拿到鎖,這個沒有順序預測,完全靠運氣,拿鎖的順序不可以控制。
怎麼辦?
我們用訊息佇列就可以做這個事情,我有一些任務要執行,我就把任務丟到佇列裡面去,有一個執行緒拿走一個任務,那麼下一個執行緒拿走一定是下一個任務,所以我們的任務時可以按順序執行。
兩種阻塞可能:
①訊息佇列是同步阻塞,就是我往裡面放東西的時候,別人就不能放;我從裡面取東西的時候,別人就不能取。(著重點:
②我的Queue(訊息佇列)滿的時候,就不能在push了,要等別人從佇列裡把東西取走。其實訊息都列對阻塞存取也可以,對非阻塞存取也可以。(著重點:在Queue(訊息佇列)滿的時候,即不能在插入的時候,這個時候,是可以由使用者決定是阻塞等待空間,還是繼續執行其他操作)
主要方法:
put、take 一對阻塞存取(即當佇列為空的時候或滿的時候,會等待空間)
add、poll(time) 一對非阻塞存取(即當佇列滿的時候,丟擲異常並且該執行緒中斷;當佇列為空的時候,可以等待規定時間內,仍取不到數後停止等待,繼續執行帶執行緒後面
插入:
1、add(anObject):把anObject加到BlockingQueue裡面,即BlockingQueue可以容納就返回true,否則丟擲異常。
2、offer(anObject):把anObject加到BlockingQueue裡面,即BlockingQueue可以容納就返回true,否則返回false。
3、put(anObject):把anObject加到BlockingQueue裡面,如果BlockingQueue沒有空間,則等待,直到BlockingQueue有空間再繼續。
讀取:
1、poll(time):取走BlockingQueue
2、take():取走BlockingQueue隊首的物件,若BlockingQueue為空,則阻塞,一直等到拿到東西才走。
其他:
1、int remainingCapacity():返回佇列剩餘容量,如果正好有資料再插入或者取出的時候,這個資料就可能不準。
2、boolean remove(Object o):從佇列裡面移除元素,如果存在,即移除一個或者多個。佇列改變了返回true。
3、public boolean contain(Object o):檢視佇列是否存在這個元素,存在返回true。
4、int drainTo(Collection<? supper E> c):移除佇列裡面所有可用的元素,並將他們新增到collection中。
5、int drainTo(Collection<? supper E> c, int maxElements):規定了移除的最大maxElements個元素。
BlockingQueue有四個具體的實現類,常用的有:
ArrayBlockingQueue:是基於一個數組,再構造的時候傳入一個int,確定陣列的大小。
LinkedBlockingQueue:構造的時候不傳int的時候,預設有Integer.MAX_VALUE那麼大。