DelayQueue
是一个支持延时获取元素的无界阻塞队列。队列使用 PriorityQueue 来实现。 队列中的元素必须实现 Delayed接口,在创建元素时可以指定多久才能从队列中 获取当前元素。只有在延迟期满时才能从队列中提取元素。
1.将订单推入队列中
/**
*类说明:将订单推入队列
*/
public class PutOrder implements Runnable {
private DelayQueue<ItemVo<Order>> queue;
public PutOrder(DelayQueue<ItemVo<Order>> queue){
this.queue = queue;
}
@Override
public void run() {
//5秒后到期
Order orderTb = new Order("Tb12345",366);
ItemVo<Order> itemTb = new ItemVo<Order>(5,orderTb);
queue.offer(itemTb);
System.out.println("订单5秒后超时:"+orderTb.getOrderNo()+";"
+orderTb.getOrderMoney());
//8秒后到期
Order orderJd = new Order("Jd54321",366);
ItemVo<Order> itemJd = new ItemVo<Order>(8,orderJd);
queue.offer(itemJd);
System.out.println("订单8秒后超时:"+orderJd.getOrderNo()+";"
+orderJd.getOrderMoney());
}
}
2.取出到期的订单的功能
/**
*类说明:取出到期的订单的功能
*/
public class FetchOrder implements Runnable {
private DelayQueue<ItemVo<Order>> queue;
public FetchOrder(DelayQueue<ItemVo<Order>> queue){
this.queue = queue;
}
@Override
public void run() {
while(true) {
try {
ItemVo<Order> item = queue.take();
Order order = (Order)item.getData();
System.out.println("Get From Queue:"+"data="
+order.getOrderNo()+";"+order.getOrderMoney());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
3.订单的实体类
/**
*类说明:订单的实体类
*/
public class Order {
private final String orderNo;//订单的编号
private final double orderMoney;//订单的金额
public Order(String orderNo, double orderMoney) {
super();
this.orderNo = orderNo;
this.orderMoney = orderMoney;
}
public String getOrderNo() {
return orderNo;
}
public double getOrderMoney() {
return orderMoney;
}
}
4.存放的队列的元素
/**
*类说明:存放的队列的元素,
*/
public class ItemVo<T> implements Delayed {
//到期时间,但传入的数值代表过期的时长,传入单位毫秒
private long activeTime;
private T data;//业务数据,泛型
//传入过期时长,单位秒,内部转换
public ItemVo(long expirationTime, T data) {
this.activeTime = expirationTime*1000+System.currentTimeMillis();
this.data = data;
}
public long getActiveTime() {
return activeTime;
}
public T getData() {
return data;
}
/*
* 这个方法返回到激活日期的剩余时间,时间单位由单位参数指定。
*/
@Override
public long getDelay(TimeUnit unit) {
long d = unit.convert(this.activeTime
-System.currentTimeMillis(),unit);
return d;
}
/*
*Delayed接口继承了Comparable接口,按剩余时间排序,实际计算考虑精度为纳秒数
*/
@Override
public int compareTo(Delayed o) {
long d = (getDelay(TimeUnit.MILLISECONDS)
- o.getDelay(TimeUnit.MILLISECONDS));
if (d==0){
return 0;
}else{
if (d<0){
return -1;
}else{
return 1;
}
}
}
}
/**
*类说明:取出到期的订单的功能
*/
public class FetchOrder implements Runnable {
private DelayQueue<ItemVo<Order>> queue;
public FetchOrder(DelayQueue<ItemVo<Order>> queue){
this.queue = queue;
}
@Override
public void run() {
while(true) {
try {
ItemVo<Order> item = queue.take();
Order order = (Order)item.getData();
System.out.println("Get From Queue:"+"data="
+order.getOrderNo()+";"+order.getOrderMoney());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}