DelayQueue實現延遲訊息

2021-07-24 12:29:10 字數 2943 閱讀 9230

最近想做乙個定時推送訊息的功能,經過調研了解到delayqueue,訊息物件需實現delayed介面裡的getdelay(timeunit unit)方法,由於delayed繼承了comparable故需要實現compareto方法,可用於決定訊息的推送次序。以考試為例,設定每個考生的交卷時間點。

學生物件:

/**

* *@author peiyu

*/public

class

student

implements

runnable,delayed

public

student(string name, date date, string id)

@override

public

void

run()

@suppresswarnings("static-access")

@override

public

long

getdelay(timeunit unit)

@override

public

intcompareto(delayed o)

public

static

class

endexam

extends

student

@override

public

void

run()

}@override

public

boolean

equals(object obj)

/*** 設定name.

*@return 返回name

*/public string getname()

/*** 設定date.

*@return 返回date

*/public date getdate()

/*** 獲取name.

*@param name 要設定的name

*/public

void

setname(string name)

/*** 獲取date.

*@param date 要設定的date

*/public

void

setdate(date date)

/*** 設定id.

*@return 返回id

*/public string getid()

/*** 獲取id.

*@param id 要設定的id

*/public

void

setid(string id)

}

教師類

public

class

teacher

implements

runnable

@override

public

void

run()

system.out.println("考試結束……");

} catch (interruptedexception e)

}

}

測試類,開始考試

public class exam  catch (interruptedexception e) 

//將訊息從佇列中移除

student remove = new student();

remove.setid("6");

delayqueue.remove(remove);

delayqueue.put(new student("學生7", dateformat.parse("2016-11-10 16:02:10"), "7"));

// students.put(new student("學生8", dateformat.parse("2016-11-10 16:43:20"), "8"));

// students.put(new student("學生9", dateformat.parse("2016-11-10 16:43:01"), "9"));

// students.put(new student("學生10", dateformat.parse("2016-11-10 16:43:03"), "10"));

// students.put(new student("學生11", dateformat.parse("2016-11-10 16:43:11"), "11"));

// students.put(new student("學生12", dateformat.parse("2016-11-10 16:43:17"), "12"));

}}

測試結果:

考試開始……

學生1 設定時間=2016-11-10 16:02:00;執行時間=2016-11-10 16:02:00

學生7 設定時間=2016-11-10 16:02:00;執行時間=2016-11-10 16:02:00

學生5 設定時間=2016-11-10 16:03:00;執行時間=2016-11-10 16:03:00

學生4 設定時間=2016-11-10 16:06:00;執行時間=2016-11-10 16:06:00

學生3 設定時間=2016-11-10 16:08:00;執行時間=2016-11-10 16:08:00

學生2 設定時間=2016-11-10 16:09:00;執行時間=2016-11-10 16:09:00

在考試的過程中,若有學生終止考試(不提交試卷),或有新的學生開始考試,確定交卷時間,最後學生的交卷時間都會按序。

深度解析延遲佇列DelayQueue

有時候,我們有一些任務需要 稍後 來做,比如一些連線需要空閒一段時間後再關閉,session需要空閒一段時間後自動退出。這個時候就需要一些可以延遲執行任務的工具。delayqueue 延遲佇列 就是乙個可以實現類似功能的工具。由於本篇會涉及到優先佇列priorityqueue,所以預先閱讀 深度解析...

延遲佇列 DelayQueue 使用與原始碼解析

當記憶體中有一堆的客戶資訊,需要實時移除vip到期的客戶的特權時有以下做法。以上做法2有現成的佇列可以使用,就是接下來要說的延遲佇列。是不是跟優先佇列很像。delayqueue其內部就聚合了乙個優先佇列。其實現了queue,collection,blockingqueue。這裡注意一點,因為dela...

DelayQueue 實現延時佇列

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