-
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 版权协议,转载请附上原文出处链接和本声明。