延时队列DelayedQueue是一种无界的阻塞队列,内置的元素对象要实现Delayed接口,并重写getDelayed和compared方法,该方法会将插入的对象按设置的时间延时执行。
下面用我们平时去网吧上网的例子来说明该队列的使用场景及方法:
1.声明一个网民类,该类实现Delayed接口
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
//我们在这里先声明一个Delayed对象
public class Visitor implements Delayed{
private String name;
//身份证
private String id;
//截止时间
private long endTime;
//定义时间工具类
private TimeUnit timeUnit = TimeUnit.SECONDS;
public Visitor(String name,String id,long endTime){
this.name = name;
this.id = id;
this.endTime = endTime;
}
public String getName(){
return this.name;
}
public String getId(){
return this.id;
}
/**
* 判断是否到了截止时间
*/
@Override
public long getDelay(TimeUnit unit) {
// TODO Auto-generated method stub
return endTime - System.currentTimeMillis();
}
@Override
public int compareTo(Delayed o) {
Visitor vistor = (Visitor)o;
return this.getDelay(this.timeUnit) - vistor.getDelay(this.timeUnit)>0?1:0;
}
}
2.声明一个网吧类,该类实现Runnable接口,并加入上机下机的方法
import java.util.concurrent.DelayQueue;
public class NetBar implements Runnable{
private DelayQueue<Visitor> queue = new DelayQueue<Visitor>();
private Boolean operate = true;
public void PlayOn(String name,String id,int money){
Visitor visitor = new Visitor(name,id,1000*money+System.currentTimeMillis());
System.out.println("网名"+visitor.getName()+" 身份证"+visitor.getId()+" 充值"+money+"块,开始上机");
this.queue.add(visitor);
}
public void PlayOff(Visitor visitor){
System.out.println("网名"+visitor.getName()+"身份证"+visitor.getId()+"时间到,自动下机");
}
@Override
public void run() {
while(operate){
try{
Visitor visitor = queue.take();
PlayOff(visitor);
}catch(Exception e){
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try{
System.out.println("netbar开始营业");
NetBar netBar = new NetBar();
Thread t1 = new Thread(netBar);
t1.start();
netBar.PlayOn("张三", "122121", 5);
netBar.PlayOn("李四", "444553", 10);
netBar.PlayOn("王五", "2221223", 15);
}catch(Exception e){
e.printStackTrace();
}
}
}
执行结果:
netbar开始营业
网名张三 身份证122121 充值5块,开始上机
网名李四 身份证444553 充值10块,开始上机
网名王五 身份证2221223 充值15块,开始上机
网名张三身份证122121时间到,自动下机
网名李四身份证444553时间到,自动下机
网名王五身份证2221223时间到,自动下机