1、DelayQueue:
带有延迟时间的Queue,其中的元素只有当其指定了延迟时间到了,才能够从队列中获取元素。DelayQueue中的元素必须实现Delay接口,DelayQueue是一个没有大小限制的队列,应用场景很多,比如对缓存超时的数据进行移除、任务超时处理、空闲连接关闭等。
2、示例如下:
package net.oschina.tkj.mulitcoding.blockqueue.delayqueue; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; /** * 网民,放入延迟的时间队列 DelayQueue里面,元素要实现Delayed接口 * * @author Freedom * */ public class NetPerson implements Delayed { private final int id; // 身份证 private final String name; private final long endTime; public NetPerson(int id, String name, long endTime) { this.id = id; this.name = name; this.endTime = endTime; } public int getId() { return id; } public String getName() { return name; } public long getEndTime() { return endTime; } @Override public int compareTo(Delayed o) { NetPerson p = (NetPerson) o; return this.getDelay(TimeUnit.SECONDS) - p.getDelay(TimeUnit.SECONDS) > 0 ? 1 : -1; } @Override public long getDelay(TimeUnit unit) { return endTime - System.currentTimeMillis(); } @Override public String toString() { return "NetPerson [id=" + id + ", name=" + name + ", endTime=" + endTime + "]"; } }
package net.oschina.tkj.mulitcoding.blockqueue.delayqueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.DelayQueue; /** * 网吧类,为线程的任务类 * * @author Freedom * */ public class NetBar implements Runnable { // 定义一个阻塞的延迟的队列 private static BlockingQueue<NetPerson> queue = new DelayQueue<>(); // 登记用户上网的信息 public void registNetPerson(int id, String name, long money) { NetPerson person = new NetPerson(id, name, 1000 * money + System.currentTimeMillis()); System.out.println("用户:" + person + " 开始上网..."); queue.add(person); } /* * 用户下机 */ public void endPlay(NetPerson p) { System.out.println("用户:" + p + " 上机时间到了,下机..."); } @Override public void run() { NetPerson p = null; try { while (true) { p = queue.take(); endPlay(p); Thread.sleep(500); } } catch (InterruptedException e) { e.printStackTrace(); } } /** * 主函数 * * @param args */ public static void main(String[] args) { System.out.println("新的一天,网吧营业开始..."); NetBar bar = new NetBar(); Thread t1 = new Thread(bar); bar.registNetPerson(411, "张三", 10); bar.registNetPerson(342, "李四", 5); bar.registNetPerson(675, "王五", 3); t1.start(); } }
相关推荐
java使用DelayQueue延迟队列和Redis缓存实现订单自动取消功能
整个延迟队列由4个部分组成: 1. JobPool用来存放所有Job的元信息。 2. DelayBucket是一组以时间为维度的有序队列,用来存放所有需要延迟的Job(这里只存放Job Id)。 3. Timer负责实时扫描各个Bucket,并将delay...
延迟队列, 参考有赞延迟队列设计实现
主要给大家介绍了java利用delayedQueue实现本地的延迟队列的相关资料,文中介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
DelayQueue、Redis结合使延迟、定时任务使用 DelayQueue、Redis结合使延迟、定时任务使用 DelayQueue、Redis结合使延迟、定时任务使用 源代码下载
具体代码参考
数组阻塞队列ArrayBlockingQueue,延迟队列DelayQueue, 链阻塞队列 LinkedBlockingQueue,具有优先级的阻塞队列 PriorityBlockingQueue, 同步队列 SynchronousQueue,阻塞双端队列 BlockingDeque, 链阻塞双端队列 ...
1. 什么是延时队列? 2. 如何实现一个高效的延时队列?...3. DelayQueue的实现原理 4. RabbitMQ实现延时队列的基本原理 5. Redis实现延时队列的基本原理 6. 时间轮(Time Wheel) 7. 几种方案的对比
基于DelayQueue的简单的定时任务队列.zip Quick Start class Main { public static void main(String[] args) { // 初始化任务队列 JobScheduler scheduler = new JobScheduler("default"); // 向队列中提交任务...
4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 Synchronou sQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 ...
4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque ...
延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque 10...
DelayQueue是一个无界阻塞队列,只有在延迟期满时,才能从中提取元素。这篇文章主要介绍了springboot执行延时任务-DelayQueue的使用,需要的朋友可以参考下
延迟队列,顾名思义它是一种带有延迟功能的消息队列。 那么,是在什么场景下我才需要这样的队列呢? 一、背景 先看看一下业务场景: 1.会员过期前3天发送召回通知 2.订单支付成功后,5分钟后检测下游环节是否都正常...
学习视频,可以丰富java知识。能够获得更多的专业技能
1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于...
延迟队列就是个带延迟功能的消息队列,相对于普通队列,它可以在指定时间消费掉消息。 延迟队列的应用场景: 1、新用户注册,10分钟后发送邮件或站内信。 2、用户下单后,30分钟未支付,订单自动作废。 我们通过...
4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque ...
DelayQueue的使用以及注意事项,这里需要由BlockingQueue的基本知识,一般的Queue的使用方法poll(),take(),drainTo()和offer(),put()这些应该懂。
4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque ...