package com.bfxy.thread.core.mycollection;
import java.util.concurrent.DelayQueue;
/**
* 模拟一个驾校学员签到签退的场景
*/
public class Jiaxiao implements Runnable{
private DelayQueue<Xueyuan> dq = new DelayQueue<Xueyuan>();
public boolean start = true; //表示驾校在上课的时候
public void qiandao(Integer id, String name, Long time){
Xueyuan xueyuan = new Xueyuan(id,name,time);
dq.add(xueyuan);
System.out.println(xueyuan.getName()+" 签到");
}
public void qiantui(Xueyuan xueyuan){
System.out.println(xueyuan.getName()+" 时间已到,请签退");
}
@Override
public void run() {
while (start){
try {
Xueyuan xueyuan = dq.take();
qiantui(xueyuan);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
Jiaxiao jiaxiao = new Jiaxiao();
Thread t1 = new Thread(jiaxiao);
t1.start();
try {
jiaxiao.qiandao(1,"周鹏",System.currentTimeMillis());
Thread.sleep(2000);
jiaxiao.qiandao(2,"朱正兴",System.currentTimeMillis());
Thread.sleep(2000);
jiaxiao.qiandao(3,"张新",System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
学员的实体类:
package com.bfxy.thread.core.mycollection;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class Xueyuan implements Delayed{
public Integer id;
public String name;
public Long qiandaotime;
public Xueyuan(Integer id, String name,Long qiandaotime) {
this.id = id;
this.name = name;
this.qiandaotime = qiandaotime;
}
private final TimeUnit timeUnit = TimeUnit.SECONDS;
private final int shangketime = 10000;//10s 延迟时间
@Override
public long getDelay(TimeUnit unit) {//需要实现的接口,获得延迟时间 用过期时间-当前时间
return (qiandaotime+shangketime)- System.currentTimeMillis();
}
@Override
public int compareTo(Delayed o) {//用于延迟队列内部比较排序 当前对象的延迟时间 - 比较对象的延迟时间
Xueyuan xueyuan = (Xueyuan) o;
return this.getDelay(timeUnit) - o.getDelay(timeUnit) > 0 ? 1 : -1;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getQiandaotime() {
return qiandaotime;
}
public void setQiandaotime(Long qiandaotime) {
this.qiandaotime = qiandaotime;
}
}
执行结果: