delayqueue是乙個無界阻塞佇列,只有在延遲期滿時才能從中提取元素。該佇列的頭部是延遲期滿後儲存時間最長的delayed 元素。
delayqueue是乙個用來延時處理的佇列,所謂延時處理就是說可以為佇列中元素設定乙個過期時間,相關的操作受到這個設定時間的控制。
a) 關閉空閒連線。伺服器中,有很多客戶端的連線,空閒一段時間之後需要關閉之。
b) 快取。快取中的物件,超過了空閒時間,需要從快取中移出。
c) 任務超時處理。在網路協議滑動視窗請求應答式互動時,處理超時未響應的請求。
如果不使用delayqueue,那麼常規的解決辦法就是:使用乙個後台執行緒,遍歷所有物件,挨個檢查。這種笨笨的辦法簡單好用,但是物件數量過多時,可能存在效能問題,檢查間隔時間不好設定,間隔時間過大,影響精確度,過小則存在效率問題。而且做不到按超時的時間順序處理。
首先,這種佇列中只能存放實現delayed介面的物件,而此介面有兩個需要實現的方法。最重要的就是getdelay,這個方法需要返回物件過期前的時間。簡單說,佇列在某些方法處理前,會呼叫此方法來判斷物件有沒有超時。
其次,delayqueue是乙個blockingqueue,其特化的引數是delayed。(不了解blockingqueue的同學,先去了解blockingqueue再看本文)
delayed擴充套件了comparable介面,比較的基準為延時的時間值,delayed介面的實現類getdelay的返回值應為固定值(final)。delayqueue內部是使用priorityqueue實現的。
總結,delayqueue的關鍵元素blockingqueue、priorityqueue、delayed。可以這麼說,delayqueue是乙個使用優先佇列(priorityqueue)實現的blockingqueue,優先佇列的比較基準值是時間。本質上即:
delayqueue = blockingqueue +priorityqueue + delayed
他們的基本定義如下
public
inte***ce
comparable
<
t >
public
inte***ce
delayed
extends
comparable
<
delayed
>
public
class
delayqueue
<
e extends
delayed
>
implements
blockingqueue
<
e >
delayqueue內部的實現使用了乙個優先佇列。當呼叫delayqueue的offer方法時,把delayed物件加入到優先佇列q中。如下:
public
boolean
offer(e e)
finally
}delayqueue的take方法,把優先佇列q的first拿出來(peek),如果沒有達到延時閥值,則進行await處理。如下:
public
e take()
throws
interruptedexception
else
else
}}}
finally
}——————-
DelayQueue原始碼分析
public class delayqueueextends abstractqueueimplements blockingqueue public boolean add e e public void put e e public boolean offer e e,long timeout,...
DelayQueue基本簡介
delayqueue是乙個無界阻塞佇列,只有在延遲期滿時才能從中提取元素。該佇列的頭部是延遲期滿後儲存時間最長的delayed 元素。delayqueue是乙個用來延時處理的佇列,所謂延時處理就是說可以為佇列中元素設定乙個過期時間,相關的操作受到這個設定時間的控制。關閉空閒連線。伺服器中,有很多客戶...
DelayQueue實現延遲訊息
最近想做乙個定時推送訊息的功能,經過調研了解到delayqueue,訊息物件需實現delayed介面裡的getdelay timeunit unit 方法,由於delayed繼承了comparable故需要實現compareto方法,可用於決定訊息的推送次序。以考試為例,設定每個考生的交卷時間點。學...