所谓的延迟队列最大的特征是它可以自动通过队列进行脱离,例如:现在有一些对象被临时保存着,但是有可能该集合对象是一个公共对象,那么里面的某些数据如果不再使用的时候就希望其可以在指定的时间到达后自动的消失。
DelayQueue是延迟队列主要的使用类,所谓的延迟队列=BlockingQueue + PriorityQueue + Delayed。
【 延迟队列的基本使用 】
下面编写一个简单的延时队列,延时队列的本质就是到点后自动离开。那么一定要为其设置一个离开的时间点。
范例:使用DelayedQueue进行延迟队列的定义
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class MLDNTestDemo {
public static void main(String[] args) throws Exception {
System.out.println("准备聚会。。。。。。");
// 设置延迟队列
DelayQueue<Member> queue = new DelayQueue<Member>() ;
queue.add(new Member("张三", 3, TimeUnit.SECONDS));
queue.add(new Member("李四", 5, TimeUnit.SECONDS));
// 如果聚会还有人在呢
while(!queue.isEmpty()) {
// 从里面取出数据内容
Delayed dyd = queue.poll() ;
// 如果通过队列里面可以获取数据,就表示当前的用户已经离开了,满足了延迟的条件了
System.out.println("【poll = {" + dyd + "}】"
+ System.currentTimeMillis());
// 延迟500毫秒
TimeUnit.MILLISECONDS.sleep(500);
}
}
}
// 如果成员要想离开一定要实现Delayed接口
class Member implements Delayed {
// 聚会人员的名单
private String name ;
// 失效时间,人员离开的时间,毫秒单位
private long expire ;
// 设置的延迟时间,毫秒单位
private long delay ;
/**
* 设置参与到队列之中的用户信息
* @param name 用户的姓名
* @param delay 延迟时间
* @param unit 时间处理单位
*/
public Member(String name,long delay,TimeUnit unit) {
this.name = name ;
// 保存延迟的时间
this.delay = TimeUnit.MILLISECONDS.convert(delay, unit) ;
// 当前时间加上延迟时间
this.expire = System.currentTimeMillis() + this.delay ;
}
@Override // 决定了你优先级队列的弹出操作
public int compareTo(Delayed o) {
return (int) (this.delay – this.getDelay(TimeUnit.MILLISECONDS));