import java.util.concurrent.DelayQueue; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; public class DelayQueueTest { public static void main(String[] args) throws InterruptedException { DelayQueue<Customer> q = new DelayQueue<Customer>(); Customer c1 = new Customer(5, "customer1"); Customer c2 = new Customer(10, "customer2"); Customer c3 = new Customer(2, "customer3"); Customer c4 = new Customer(17, "customer3"); q.put(c1); q.put(c2); q.put(c3); q.put(c4); int count = 1; while (true) { Thread.sleep(1000); Customer c = null; // q.take() 则会阻塞 if (null != (c = q.poll())) { System.out.println("c : " + c.getName() + " , time:" + count+ "s"); } else { System.out.println("get object " + c + " , time:" + count + "s"); } count++; if (q.isEmpty()) { break; } } System.out.println("test finished"); } } class Customer implements Delayed { private String name; // unit miutes private long delayTime;// 需要延时的时间 public Customer(long delayTime, String name) { //当前时间+过期间隔=未来过期时间 this.delayTime = System.nanoTime() + TimeUnit.SECONDS.toNanos(delayTime); this.name = name; } @Override public int compareTo(Delayed o) { Customer c = (Customer) o; return this.delayTime > c.delayTime ? 1 : (this.delayTime < c.delayTime ? -1 : 0); } @Override public long getDelay(TimeUnit unit) { long sys = System.nanoTime(); // System.out.println("delayTime : " + delayTime // + " , System.nanoTime() " + sys); long minuts = delayTime - sys; return minuts; } public long getDelayTime() { return delayTime; } public String getName() { return name; } }
get object null , time:1s get object null , time:2s get object null , time:3s get object null , time:4s c : customer1 , time:5s get object null , time:6s get object null , time:7s get object null , time:8s get object null , time:9s c : customer2 , time:10s test finished
相关推荐
学习视频,可以丰富java知识。能够获得更多的专业技能
DelayQueue的使用以及注意事项,这里需要由BlockingQueue的基本知识,一般的Queue的使用方法poll(),take(),drainTo()和offer(),put()这些应该懂。
java使用DelayQueue延迟队列和Redis缓存实现订单自动取消功能
DelayQueue、Redis结合使延迟、定时任务使用 DelayQueue、Redis结合使延迟、定时任务使用 DelayQueue、Redis结合使延迟、定时任务使用 源代码下载
DelayQueue是一个无界阻塞队列,只有在延迟期满时,才能从中提取元素。这篇文章主要介绍了springboot执行延时任务-DelayQueue的使用,需要的朋友可以参考下
基于DelayQueue的简单的定时任务队列.zip Quick Start class Main { public static void main(String[] args) { // 初始化任务队列 JobScheduler scheduler = new JobScheduler("default"); // 向队列中提交任务...
local delayQueue implemented by JDK & two kinds of distributed delayQueue based redis 1. 基本介绍 RedisSynDelayQueue 基于redis,并发情况下会加分布式锁,单线程场景(syn=false)性能较好, 并发场景性能较...
主要为大家详细介绍了Java多线程并发开发之DelayQueue使用示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
具体代码参考
除了具有很好的并发性的Collections,java.util.concurrent还引入了其他一些预先构建的组件,它们可帮助您调整和执行多线程应用程序中的线程。
Agenda • Methodology and Process • Tools of Load Test • Tuning Components in the Software Stack > Operating System > Java Virtual Machine > Application Container > Application Architecture ...
延迟队列,顾名思义它是一种带有延迟功能的消息队列。 那么,是在什么场景下我才需要这样的队列呢? 一、背景 先看看一下业务场景: 1.会员过期前3天发送召回通知 2.订单支付成功后,5分钟后检测下游环节是否都正常...
主要为大家详细介绍了redis实现简单队列的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要给大家介绍了java利用delayedQueue实现本地的延迟队列的相关资料,文中介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
首先介绍了 Timer、DelayQueue 和 ScheduledThreadPool,它们都是基于优先队列实现的,O(logn) 的时间复杂度在任务数多的情况下频繁的入队出队对性能来说有损耗。因此适合于任务数不多的情况。 Timer 是单线程的会有...
延迟队列, 参考有赞延迟队列设计实现
完整的实现了队列
#### 整体结构 整个延迟队列由4个部分组成: 1. JobPool用来存放所有Job的元信息。 2. DelayBucket是一组以时间为维度的有序队列,用来存放所有需要延迟的Job(这里只存放Job Id)。 3. Timer负责实时扫描各个...
数组阻塞队列ArrayBlockingQueue,延迟队列DelayQueue, 链阻塞队列 LinkedBlockingQueue,具有优先级的阻塞队列 PriorityBlockingQueue, 同步队列 SynchronousQueue,阻塞双端队列 BlockingDeque, 链阻塞双端队列 ...
hashmap如何解决hash冲突,为什么hashmap中的链表需要转成红黑树? hashmap什么时候会触发扩容? jdk1.8之前并发操作...LinkedBlockingQueue、DelayQueue是如何实现的? CopyOnWriteArrayList是如何保证线程安全的?