-
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); } } }
-
版权声明:本文为hsqingwei原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。