DelayQueue就是一个优先级队列,他的优先级按照里面元素的延迟时间来决定,延迟时间小的(也就是时间先到的)放在队列头(这与add的顺序无关),与元素本身的属性值有关。
DelayQueue中的元素必须是实现了Delayed接口的,而Delayed接口又是Comparable的子接口,因此DelayQueue中的元素必须覆盖Delayed接口的getDelay(TimeUnit)方法和Comparable的compareTo()方法,其实两个方法的实现都很简单。
前者:
public long getDelay(TimeUnit tu)
{
return time.System.currentTimeMillis();
}
后者:
public int compareTo(Delayed d)
{
T t=(T)d;
if(time<d.getTime())//如果自己比人家小,返回负值
return -1;
else if(time>d.getTime())//如果自己比人家大,返回正值
return 1;
else return 0;
}
关于DelayQueue的代码如下:
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.DelayQueue;
public class TestDelayQueue
{
public static void checkin(Customer cus,DelayQueue queue)
{
queue.add(cus);
System.out.println("网民"+cus.getId()+":开始上机");
}
public static void main(String [] args)
{
DelayQueue<Customer> queue=new DelayQueue<Customer>();
Customer cus1=new Customer("1",10000+System.currentTimeMillis());
Customer cus2=new Customer("2",50000+System.currentTimeMillis());
Customer cus3=new Customer("3",20000+System.currentTimeMillis());
checkin(cus1,queue);
checkin(cus2,queue);
checkin(cus3,queue);
while(queue.size()>0)
{
try
{
Customer off=queue.take();
System.out.println("网民"+off.getId()+":下机");
}
catch (Exception e)
{
e.printStackTrace();
}
}
System.out.println("网吧内已经没有顾客");
}
}
class Customer implements Delayed
{
private String id;
private long time;
public Customer(String id,long time)
{
this.id=id;
this.time=time;
}
public String getId()
{
return this.id;
}
public long getTime()
{
return time;
}
public long getDelay(TimeUnit tu)
{
return time-System.currentTimeMillis();
}
public int compareTo(Delayed d)//当前比外来户小返回负值,当前比外来户大返回正值
{
Customer c=(Customer)d;
if(time>c.getTime())
return 1;
else if(time<c.getTime())
return -1;
else
return 0;
}
}
大家会发现,Customer中有个属性time,这个属性是绝对时间,即希望当前对象被执行的时间,getDelay是覆盖Delayed的函数,这个函数返回相对的时间,系统也正是利用这个来判断还有多长时间要执行某个对象。而compareTo用来确定队列中对象的先后顺序,当然希望从小打到大排序。
分享到:
相关推荐
java使用DelayQueue延迟队列和Redis缓存实现订单自动取消功能
DelayQueue的使用以及注意事项,这里需要由BlockingQueue的基本知识,一般的Queue的使用方法poll(),take(),drainTo()和offer(),put()这些应该懂。
DelayQueue、Redis结合使延迟、定时任务使用 DelayQueue、Redis结合使延迟、定时任务使用 DelayQueue、Redis结合使延迟、定时任务使用 源代码下载
基于DelayQueue的简单的定时任务队列.zip Quick Start class Main { public static void main(String[] args) { // 初始化任务队列 JobScheduler scheduler = new JobScheduler("default"); // 向队列中提交任务...
DelayQueue是一个无界阻塞队列,只有在延迟期满时,才能从中提取元素。这篇文章主要介绍了springboot执行延时任务-DelayQueue的使用,需要的朋友可以参考下
local delayQueue implemented by JDK & two kinds of distributed delayQueue based redis 1. 基本介绍 RedisSynDelayQueue 基于redis,并发情况下会加分布式锁,单线程场景(syn=false)性能较好, 并发场景性能较...
主要为大家详细介绍了Java多线程并发开发之DelayQueue使用示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
具体代码参考
延迟队列,顾名思义它是一种带有延迟功能的消息队列。 那么,是在什么场景下我才需要这样的队列呢? 一、背景 先看看一下业务场景: 1.会员过期前3天发送召回通知 2.订单支付成功后,5分钟后检测下游环节是否都正常...
首先介绍了 Timer、DelayQueue 和 ScheduledThreadPool,它们都是基于优先队列实现的,O(logn) 的时间复杂度在任务数多的情况下频繁的入队出队对性能来说有损耗。因此适合于任务数不多的情况。 Timer 是单线程的会有...
主要给大家介绍了java利用delayedQueue实现本地的延迟队列的相关资料,文中介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
延迟队列, 参考有赞延迟队列设计实现
数组阻塞队列ArrayBlockingQueue,延迟队列DelayQueue, 链阻塞队列 LinkedBlockingQueue,具有优先级的阻塞队列 PriorityBlockingQueue, 同步队列 SynchronousQueue,阻塞双端队列 BlockingDeque, 链阻塞双端队列 ...
#### 整体结构 整个延迟队列由4个部分组成: 1. JobPool用来存放所有Job的元信息。 2. DelayBucket是一组以时间为维度的有序队列,用来存放所有需要延迟的Job(这里只存放Job Id)。 3. Timer负责实时扫描各个...
hashmap如何解决hash冲突,为什么hashmap中的链表需要转成红黑树? hashmap什么时候会触发扩容? jdk1.8之前并发操作...LinkedBlockingQueue、DelayQueue是如何实现的? CopyOnWriteArrayList是如何保证线程安全的?
Java并发编程常见知识点源码集锦,涉及到对象锁,Executors多任务线程框架,线程池等... ConcurrentLinkedQueue、DelayQueue示例、自定义的线程拒绝策略、自定义线程池(使用有界队列)、自定义线程池(使用无界队列)。。。
除了具有很好的并发性的Collections,java.util.concurrent还引入了其他一些预先构建的组件,它们可帮助您调整和执行多线程应用程序中的线程。
4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 Synchronou sQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 ...
Agenda • Methodology and Process • Tools of Load Test • Tuning Components in the Software Stack > Operating System > Java Virtual Machine > Application Container > Application Architecture ...