delayqueue是乙個無界阻塞佇列,佇列中的元素必須實現delayed介面,在建立元素時可以指定多久才能從佇列中獲取當前元素。只有在延遲期滿時才能從佇列中提取元素。
delayqueue可以用作快取系統的設計,可以用delayqueue儲存快取元素的有效期,使用乙個執行緒迴圈查詢delayqueue,一旦能從delayqueue中獲取元素時,表示快取有效期到了。
本文使用delayqueue實現訂單限時支付處理,以此加深對delayqueue的理解。
實現delayed介面,封裝放入delayqueue中的元素
@getter
@setter
@tostring
public
class
itemvo
implements
delayed
//用於獲取到期剩餘時間
public
long
getdelay
(timeunit unit)
//按照剩餘時間排序
public
intcompareto
(delayed o)
else
else}}
}
訂單實體
@getter
@setter
@tostring
public
class
orderentity
}
啟動三個執行緒,分別模擬生成訂單、支付訂單、處理訂單超時
public
class
delayorder
catch
(interruptedexception e)}}
).start()
;//模擬已經支付的訂單
newthread((
)->
//處理完從map中移除
map.
remove
(orderno);}
catch
(interruptedexception e)}}
).start()
;//處理超時訂單執行緒
newthread((
)->
//處理完從map中移除
map.
remove
(orderentity.
getorderno()
);}catch
(interruptedexception e)}}
).start();}}
執行結果: DelayQueue實現延遲訊息
最近想做乙個定時推送訊息的功能,經過調研了解到delayqueue,訊息物件需實現delayed介面裡的getdelay timeunit unit 方法,由於delayed繼承了comparable故需要實現compareto方法,可用於決定訊息的推送次序。以考試為例,設定每個考生的交卷時間點。學...
DelayQueue 實現延時佇列
延遲佇列不需要不停的掃瞄快取 任務 輪訓等,它能夠實現在準確的時間點去執行任務。public class delaytask implements delayed public taskbase getdata public long getexpire override public long g...
DelayQueue延時佇列的使用
在談到delayqueue的使用和原理的時候,我們首先介紹一下delayqueue,delayqueue是乙個無界阻塞佇列,只有在延遲期滿時才能從中提取元素。該佇列的頭部是延遲期滿後儲存時間最長的delayed 元素。delayqueue阻塞佇列在我們系統開發中也常常會用到,例如 快取系統的設計,快...