最近想做乙個定時推送訊息的功能,經過調研了解到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...