DelayedQueue是一个用来延时处理的队列。可以为队列中的元素添加一个过期的时间,
队列中的元素 要实现 delay接口中的两个方法
存入队列:add offer put
从队列中获取:peek poll take
peek:获取队列的head对象,但不是从队列中移除。如果队列空,就返回空
poll :获取并移出队列head对象。如果head没有超时,返回空
poll w/ timeout参数 : 获取并移出队列head对象。如果没有超时head对象,会wait当前线程知道有超时对象,或者按照超时参数设定,返回空
take : 获取并移出队列head对象。如果没有超时head对象,会wait当前线程知道有对象满足超时条件
DelayedQueue实现保证了最快过期的对象排在head位置,也就是说它会在每次peek时候返回最快超时的对象。
@SpringBootApplication public class DemoApplication { public static void main(String[] args) throws InterruptedException { DelayQueue<Person> delayQueue = new DelayQueue<>(); delayQueue.clear(); Calendar calendar = Calendar.getInstance(); for (int i=1;i<11;i++){ calendar.add(Calendar.SECOND,i*10); Person m = new Person(i+" is id",i+" is name",System.currentTimeMillis()+i*1000,calendar.getTime()); delayQueue.add(m); } Iterator<Person> iterator = delayQueue.iterator(); while(iterator.hasNext()){ Person p=iterator.next(); System.out.println(p); } while(!delayQueue.isEmpty()){ Person message = delayQueue.take();//阻塞方法 System.out.println(message); } } } class Person implements Delayed{ private String id; private String name; private long insertTime; private Date outTime; public Person(String id, String name,long insertTime,Date outTime) { super(); this.id = id; this.name = name; this.insertTime = insertTime; this.outTime = outTime; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getInsertTime() { return insertTime; } public void setInsertTime(long insertTime) { this.insertTime = insertTime; } public Date getOutTime() { return outTime; } public void setOutTime(Date outTime) { this.outTime = outTime; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", outTime=" + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(outTime) + "]"; } @Override public int compareTo(Delayed o) { Person person = (Person) o; if(this.insertTime > person.insertTime){ return 1; }else if(this.insertTime == person.insertTime){ return 0; }else{ return -1; } } @Override public long getDelay(TimeUnit unit) { return this.outTime.getTime()-System.currentTimeMillis(); } }