delay在java中有什么用_DelayQueue怎么在Java多线程并发开发中使用
DelayQueue怎么在Java多線程并發(fā)開(kāi)發(fā)中使用
發(fā)布時(shí)間:2020-12-05 17:29:31
來(lái)源:億速云
閱讀:56
作者:Leah
這篇文章給大家介紹DelayQueue怎么在Java多線程并發(fā)開(kāi)發(fā)中使用,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(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,許多的單身狗開(kāi)始組團(tuán)來(lái)到KTV唱歌。那么KTV這個(gè)時(shí)候如何通過(guò)程序來(lái)收費(fèi)記時(shí)的呢,模擬的代碼如下:
public class KTV implements Runnable{
private DelayQueue 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āi)始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āi)始K歌...
李四 等人交了200元錢,進(jìn)入666號(hào)包廂,開(kāi)始K歌...
王五 等人交了100元錢,進(jìn)入888號(hào)包廂,開(kāi)始K歌...
================================
李四 等人所在的666號(hào)包廂,時(shí)間到...
王五 等人所在的888號(hào)包廂,時(shí)間到...
張三 等人所在的111號(hào)包廂,時(shí)間到...
關(guān)于DelayQueue怎么在Java多線程并發(fā)開(kāi)發(fā)中使用就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
總結(jié)
以上是生活随笔為你收集整理的delay在java中有什么用_DelayQueue怎么在Java多线程并发开发中使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C语言实现前部插入创建链表以及尾部插入链
- 下一篇: java get cookies_Jav