DelayQueue原理分析

2021-07-27 07:41:49 字數 1653 閱讀 6052

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方法,可用於決定訊息的推送次序。以考試為例,設定每個考生的交卷時間點。學...