java隊列使用

Java知識總結----隊列的使用

操作方法

(01)首先我們要知道使用隊列的目的是什麼?一般情況下,如果是一些及時消息的處理,並且處理時間很短的情況下是不需要使用隊列的,直接阻塞式的方法調用就可以了。但是,如果在消息處理的時候特別費時間,這個時候如果有新的消息來了,就只能處於阻塞狀態,造成用戶等待。這個時候在項目中引入隊列是十分有必要的。當我們接受到消息後,先把消息放到隊列中,然後再用新的線程進行處理,這個時候就不會有消息的阻塞了。下面就跟大家介紹兩種隊列的使用,一種是基於內存的,一種是基於數據庫的。

(02)首先,我們來看看基於內存的隊列。在Java的併發包中已經提供了BlockingQueue的實現,比較常用的有ArrayBlockingQueue和LinkedBlockingQueue,前者是以數組的形式存儲,後者是以Node節點的鏈表形式存儲。至於數組和鏈表的區別這裏就不多說了。

(03)BlockingQueue 隊列常用的操作方法:1.往隊列中添加元素: add(), put(), offer()2.從隊列中取出或者刪除元素: remove() element()  peek()   pool()  take()

(04)每個方法的說明如下:offer()方法往隊列添加元素如果隊列已滿直接返回false,隊列未滿則直接插入並返回true;add()方法是對offer()方法的簡單封裝.如果隊列已滿,拋出異常new IllegalStateException("Queue full");put()方法往隊列裏插入元素,如果隊列已經滿,則會一直等待直到隊列爲空插入新元素,或者線程被中斷拋出異常ve()方法直接刪除隊頭的元素:peek()方法直接取出隊頭的元素,並不刪除ent()方法對peek方法進行簡單封裝,如果隊頭元素存在則取出並不刪除,如果不存在拋出異常NoSuchElementException()pool()方法取出並刪除隊頭的元素,當隊列爲空,返回null;take()方法取出並刪除隊頭的元素,當隊列爲空,則會一直等待直到隊列有新元素可以取出,或者線程被中斷拋出異常offer()方法一般跟pool()方法相對應, put()方法一般跟take()方法相對應.日常開發過程中offer()與pool()方法用的相對比較頻繁.

(05)下面用一個例子來看看是怎麼使用的。

java隊列使用

(06)以上呢,就是基於內存的隊列的介紹,基於內存的隊列,隊列的大小依賴於JVM內存的大小,一般如果是內存佔用不大且處理相對較爲及時的都可以採用此種方法。如果你在隊列處理的時候需要有失敗重試機制,那麼用此種隊列就不是特別合適了。下面就說說基於數據庫的隊列。基於數據庫的隊列,很好理解,就是接收到消息之後,把消息存入數據庫中,設置消費時間、重試次數等,再用新的線程從數據庫中讀取信息,進行處理。首先來看看數據庫的設計。

java隊列使用 第2張

(07)代碼示例如下:

java隊列使用 第3張

(08)獲取到消息之後,還需要再判斷消息是否合法,如是否達到最大消費次數,消息是否已被成功消費,等,判斷代碼如下:

java隊列使用 第4張

(09)消息處理完畢之後,根據消費結果修改數據庫中的狀態。

java隊列使用 第5張

(10)下次消費時間的計算如下:根據消費次數計算,每次消費存在遞增的時間間隔。

java隊列使用 第6張

(11)除此之外,對於消費完成,等待刪除的消息,可以將消息直接刪除或者是進行備份。最好不要在該表中保留太多需要刪除的消息,以免影響數據庫的查詢效率。我們在處理消息的時候,首先對消息進行了鎖定,設置了locker,如果系統出現異常的時候,也會產生消息一直處於被鎖定的狀態,此時可能還需要定期去修復被鎖定的消息。

java隊列使用 第7張

(12)以上就是對兩種隊列的簡單說明。在使用基於數據庫的隊列的時候,其中還使用到了事件處理機制,這部分的內容,就下次的時候再去介紹。