java佇列使用

來源:酷知科普網 7.77K

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)以上就是對兩種佇列的簡單說明。在使用基於資料庫的佇列的時候,其中還使用到了事件處理機制,這部分的內容,就下次的時候再去介紹。

熱門標籤