Java多線程并發(fā)開發(fā)之DelayQueue使用示例
在學(xué)習(xí)Java 多線程并發(fā)開發(fā)過(guò)程中,了解到DelayQueue類的主要作用:是一個(gè)無(wú)界的BlockingQueue,用于放置實(shí)現(xiàn)了Delayed接口的對(duì)象,其中的對(duì)象只能在其到期時(shí)才能從隊(duì)列中取走。這種隊(duì)列是有序的,即隊(duì)頭對(duì)象的延遲到期時(shí)間最長(zhǎng)。注意:不能將null元素放置到這種隊(duì)列中。
Delayed,一種混合風(fēng)格的接口,用來(lái)標(biāo)記那些應(yīng)該在給定延遲時(shí)間之后執(zhí)行的對(duì)象。此接口的實(shí)現(xiàn)必須定義一個(gè) compareTo 方法,該方法提供與此接口的 getDelay 方法一致的排序。
在網(wǎng)上看到了一些示例,發(fā)現(xiàn)有的示例存在一些問(wèn)題,做了些修改,希望能幫助大家理解。
中國(guó)人都喜歡K歌,大部分人的內(nèi)心都住著一個(gè)歌手的夢(mèng),尤其是學(xué)生時(shí)代,大家都喜歡組團(tuán)去KTV唱歌,一唱一下午,大家都唱得很爽。話說(shuō)又到了一年一度的雙11,許多的單身狗開始組團(tuán)來(lái)到KTV唱歌。那么KTV這個(gè)時(shí)候如何通過(guò)程序來(lái)收費(fèi)記時(shí)的呢,模擬的代碼如下:
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+"元錢,進(jìn)入"+man.getBoxNum()+"號(hào)包廂,開始K歌..."); this.queue.add(man); } public void end(KTVConsumer man){ System.out.println(man.getName()+" 等人所在的"+man.getBoxNum()+"號(hào)包廂,時(shí)間到..."); } @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íng)業(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; //截止時(shí)間 private long endTime; //包廂號(hào) 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; } /** * 用來(lái)判斷是否到了截止時(shí)間 */ @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); } }
運(yùn)行的結(jié)果如下:
KTV正常營(yíng)業(yè) ================================ 張三 等人交了500元錢,進(jìn)入111號(hào)包廂,開始K歌... 李四 等人交了200元錢,進(jìn)入666號(hào)包廂,開始K歌... 王五 等人交了100元錢,進(jìn)入888號(hào)包廂,開始K歌... ================================ 李四 等人所在的666號(hào)包廂,時(shí)間到... 王五 等人所在的888號(hào)包廂,時(shí)間到... 張三 等人所在的111號(hào)包廂,時(shí)間到...
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JdbcTemplate操作數(shù)據(jù)庫(kù)的具體方法
這篇文章主要介紹了JdbcTemplate操作數(shù)據(jù)庫(kù)的具體操作方法,準(zhǔn)備工作需要大家先導(dǎo)入相關(guān)的jar包,建個(gè)數(shù)據(jù)庫(kù),具體操作方法跟隨小編一起看看吧2022-03-03Maven一鍵部署Springboot到Docker倉(cāng)庫(kù)為自動(dòng)化做準(zhǔn)備(推薦)
這篇文章主要介紹了Maven一鍵部署Springboot到Docker倉(cāng)庫(kù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07SpringBoot工程打包后執(zhí)行Java?-Jar就能啟動(dòng)的步驟原理
這篇文章主要介紹了SpringBoot工程打包后為何執(zhí)行Java?-Jar就能啟動(dòng),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05詳解Spring mvc的web.xml配置說(shuō)明
本篇文章主要介紹了Spring mvc的web.xml配置說(shuō)明,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02spring-mvc/springboot使用MockMvc對(duì)controller進(jìn)行測(cè)試
這篇文章主要介紹了spring-mvc/springboot使用MockMvc對(duì)controller進(jìn)行測(cè)試,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11SpringBoot yaml語(yǔ)法與數(shù)據(jù)讀取操作詳解
YAML 是 “YAML Ain’t Markup Language”(YAML 不是一種標(biāo)記語(yǔ)言)的遞歸縮寫。在開發(fā)的這種語(yǔ)言時(shí),YAML 的意思其實(shí)是:“Yet Another Markup Language”(仍是一種標(biāo)記語(yǔ)言),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07解決Test類中不能使用Autowired注入bean的問(wèn)題
這篇文章主要介紹了解決Test類中不能使用Autowired注入bean的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09