- DelayQueue:一个使用优先级队列实现的无界阻塞队列。
支持延时获取的元素的阻塞队列,元素必须要实现Delayed接口。
适用场景:实现自己的缓存系统,订单到期,限时支付等等。
方法 | 抛出异常 | 返回值 | 一直阻塞 | 超时退出 |
插入方法 | add | offer | put | Offer(time) |
移除方法 | remove | poll | take | Poll(time) |
检查方法 | element | peek | N/A | N/A |
-
将订单放入队列
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 ordeTb = new Order("Tb12345",366); ItemVo<Order> itemTb = new ItemVo<Order>(5000,ordeTb); queue.offer(itemTb); System.out.println("订单5秒后到期:"+ordeTb.getOrdernum()); //8秒到期 Order ordeJd = new Order("Jd54321",753); ItemVo<Order> itemJd = new ItemVo<Order>(8000,ordeJd); queue.offer(itemJd); System.out.println("订单8秒后到期:"+ordeJd.getOrdernum()); } }
-
取出到期订单
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> vo = queue.take(); System.out.println("get from queue....."+vo.getData().toString()); } catch (InterruptedException e) { e.printStackTrace(); } } } }
-
测试 public class DelayQueueTest { public static void main(String[] args) throws InterruptedException { DelayQueue<ItemVo<Order>> queue = new DelayQueue<>(); new Thread(new PutOrder(queue)).start(); new Thread(new FetchOrder(queue)).start(); for (int i = 1; i < 20; i++) { //TimeUnit.MILLISECONDS.sleep(500); Thread.sleep(500); System.out.println(i * 500); } } }