使用DelayQueue實現訂單限時支付處理

2021-10-08 05:00:58 字數 1460 閱讀 3773

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阻塞佇列在我們系統開發中也常常會用到,例如 快取系統的設計,快...