Java多線程并發(fā)開發(fā)之DelayQueue使用示例
在學習Java 多線程并發(fā)開發(fā)過程中,了解到DelayQueue類的主要作用:是一個無界的BlockingQueue,用于放置實現(xiàn)了Delayed接口的對象,其中的對象只能在其到期時才能從隊列中取走。這種隊列是有序的,即隊頭對象的延遲到期時間最長。注意:不能將null元素放置到這種隊列中。
Delayed,一種混合風格的接口,用來標記那些應該在給定延遲時間之后執(zhí)行的對象。此接口的實現(xiàn)必須定義一個 compareTo 方法,該方法提供與此接口的 getDelay 方法一致的排序。
在網上看到了一些示例,發(fā)現(xiàn)有的示例存在一些問題,做了些修改,希望能幫助大家理解。
中國人都喜歡K歌,大部分人的內心都住著一個歌手的夢,尤其是學生時代,大家都喜歡組團去KTV唱歌,一唱一下午,大家都唱得很爽。話說又到了一年一度的雙11,許多的單身狗開始組團來到KTV唱歌。那么KTV這個時候如何通過程序來收費記時的呢,模擬的代碼如下:
public class KTV implements Runnable{
private DelayQueue<KTVConsumer> queue = new DelayQueue<>();
public void begin(String name,String boxNum,int money){
KTVConsumer man = new KTVConsumer(name,boxNum,20l*money+System.currentTimeMillis());
System.out.println(man.getName()+" 等人交了"+money+"元錢,進入"+man.getBoxNum()+"號包廂,開始K歌...");
this.queue.add(man);
}
public void end(KTVConsumer man){
System.out.println(man.getName()+" 等人所在的"+man.getBoxNum()+"號包廂,時間到...");
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try {
KTVConsumer man = queue.take();
end(man);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String args[]){
try{
System.out.println("KTV正常營業(yè)");
System.out.println("================================");
KTV ktv = new KTV();
Thread sing = new Thread(ktv);
sing.start();
new Thread(new Runnable() {
@Override
public void run() {
ktv.begin("張三", "111", 500);
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
ktv.begin("李四", "666", 200);
}
}).start();
Thread.sleep(2000);
new Thread(new Runnable() {
@Override
public void run() {
ktv.begin("王五", "888", 100);
System.out.println("================================");
}
}).start();
}
catch(Exception ex){
}
}
}
public class KTVConsumer implements Delayed{
private String name;
//截止時間
private long endTime;
//包廂號
private String boxNum;
public KTVConsumer(String name,String boxNum,long endTime){
this.name=name;
this.boxNum=boxNum;
this.endTime=endTime;
}
public String getName(){
return this.name;
}
public String getBoxNum(){
return this.boxNum;
}
/**
* 用來判斷是否到了截止時間
*/
@Override
public long getDelay(TimeUnit unit) {
// TODO Auto-generated method stub
return unit.convert(endTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
/**
* 相互比較排序用
*/
@Override
public int compareTo(Delayed o) {
// TODO Auto-generated method stub
if(o == null || ! (o instanceof KTVConsumer)) return 1;
if(o == this) return 0;
KTVConsumer s = (KTVConsumer)o;
return endTime - s.endTime > 0 ? 1 :(endTime - s.endTime == 0 ? 0 : -1);
}
}
運行的結果如下:
KTV正常營業(yè) ================================ 張三 等人交了500元錢,進入111號包廂,開始K歌... 李四 等人交了200元錢,進入666號包廂,開始K歌... 王五 等人交了100元錢,進入888號包廂,開始K歌... ================================ 李四 等人所在的666號包廂,時間到... 王五 等人所在的888號包廂,時間到... 張三 等人所在的111號包廂,時間到...
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringSecurity學習之自定義過濾器的實現(xiàn)代碼
這篇文章主要介紹了SpringSecurity學習之自定義過濾器的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-01-01
Spring Boot中的SpringSecurity基礎教程
Spring Security是一個功能強大且高度可定制的身份驗證和訪問控制框架。它實際上是保護基于spring的應用程序的標準Spring Security是一個框架,側重于為Java應用程序提供身份驗證和授權,這篇文章主要介紹了Spring Boot中的SpringSecurity學習,需要的朋友可以參考下2023-01-01
java.lang.InterruptedException異常的問題解決
本文主要介紹了java.lang.InterruptedException異常的問題解決,這種異常通常意味著 Jenkins 任務在執(zhí)行過程中被中斷,這可能會導致任務失敗或中止,下面就來介紹一下解決方法,感興趣的可以了解一下2024-07-07
Java中BufferedReader類獲取輸入輸入字符串實例
這篇文章主要介紹了Java中BufferedReader類獲取輸入輸入字符串實例,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02
Mybatis傳單個參數(shù)和<if>標簽同時使用的問題及解決方法
這篇文章主要介紹了Mybatis傳單個參數(shù)和<if>標簽同時使用的問題及解決方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-05-05
利用Netty+SpringBoot實現(xiàn)定時后端向前端推送數(shù)據(jù)
這篇文章主要介紹了BIO、NIO、AIO三種Java?IO模型,并探討了如何使用Spring?Boot集成Netty實現(xiàn)后臺向前端推送信息的功能,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-01-01

