DelayQueue延時佇列的使用

2021-06-26 12:47:35 字數 1649 閱讀 7656

在談到delayqueue的使用和原理的時候,我們首先介紹一下delayqueue,delayqueue是乙個無界阻塞佇列,只有在延遲期滿時才能從中提取元素。該佇列的頭部是延遲期滿後儲存時間最長的delayed 元素。

delayqueue阻塞佇列在我們系統開發中也常常會用到,例如:快取系統的設計,快取中的物件,超過了空閒時間,需要從快取中移出;任務排程系統,能夠準確的把握任務的執行時間。我們可能需要通過執行緒處理很多時間上要求很嚴格的資料,如果使用普通的執行緒,我們就需要遍歷所有的物件,乙個乙個的檢查看資料是否過期等,首先這樣在執行上的效率不會太高,其次就是這種設計的風格也大大的影響了資料的精度。乙個需要12:00點執行的任務可能12:01才執行,這樣對資料要求很高的系統有更大的弊端。由此我們可以使用delayqueue。

延遲堵塞佇列的實現原理類似於timertask。下面假設對超過一定時間的問題的狀態修改為實現目標來完成。首先我們利用普通執行緒對n個問題,然後比對問題的建立時間和現在的時間比較然後來修改問題的狀態:

1.首先建立乙個task類,要求實現delayed,這點類似於timertask。設定成員變數「到期時間」,「以及問題物件」並建立構造方法 如下:

public class task implements delayed 

/*** 返回與此物件相關的剩餘延遲時間,以給定的時間單位表示

*/@override

public long getdelay(timeunit unit)

2.建立job類,該類用於執行task,在這裡申明乙個執行緒,該執行緒用於用佇列中取出task,並將過期的問題狀態修改。delayqueue類的take()方法用於獲取並移除此佇列的頭部,在可從此佇列獲得到期延遲的元素之前一直等待。如果task中timeout大於當前的時間則可以通過take()取出到期的物件,如果沒有則該佇列一直等待。

/**

* 守護執行緒

*/private thread daemonthread;

public job()

//執行執行緒

class daemonthread implements runnable }

public void execute()

} catch (exception e)

} }

3.建立延遲佇列將task加入到延遲佇列中,如下:

/**

* 建立乙個最初為空的新 delayqueue

*/private delayqueue t = new delayqueue();

/*** 新增任務,

* time 延遲時間

* q 問題

* 使用者為問題設定延遲時間

*/public void put(long time,question q)

4.測試,檢驗延遲佇列是否可以正常執行。

listqs = new arraylist();

//從資料庫中取出10條資料

for (int i = 1; i <= 10; i++)

//設定資料庫中資料的過期時間

for (int k = 1; k <= 10; k++)

thread.sleep(200000);

DelayQueue 實現延時佇列

延遲佇列不需要不停的掃瞄快取 任務 輪訓等,它能夠實現在準確的時間點去執行任務。public class delaytask implements delayed public taskbase getdata public long getexpire override public long g...

DelayQueue延時佇列示例

delayqueue是乙個無界阻塞佇列,只有在延遲期滿時才能從中提取元素。該佇列的頭部是延遲期滿後儲存時間最長的delayed 元素。快取系統的設計,快取中的物件,超過了空閒時間,需要從快取中移出 任務排程系統,能夠準確的把握任務的執行時間。我們可能需要通過執行緒處理很多時間上要求很嚴格的資料,如果...

延時任務 DelayQueue詳解

3.總結 delayqueue中的元素要實現delayed介面,delayed介面又實現了 comparable介面 public inte ce delayed extends comparable public inte ce comparable class work implements d...