DelayQueue----一种有序队列,特点就是只有在队列中的元素到期后才能取出。
1.内存中哪些对象到了超时时间,需要从内存中清除出去。
2.服务器连接中有哪些连接很长时间未操作,需要关闭这些连接
3.任务中有哪些到了执行时间,该进行调度了。
简单的方法就是写一个线程不断去检查每一项是否到了时间,但这种方法在队列中的元素非常多的情况下会不准确或太耗费性能,用DelayQueue可完美地解决这个问题。
马上就要过年了,每次回老家都要悲催地去镇上人挤人的网吧上网。下面就拿这个做个例子:
假设镇上开了一家无限大的网吧,每人交一块钱可以上一分钟网(过年时的网吧坑爹程度差不多就这样);
网吧比较老式没有先进的管理系统,为了知道哪个家伙时间到该下机了,老板得一台一台地去看,上网的人一多等老板把整个网吧转一遍有些家伙早超时了,而且老板要一遍一遍地检查也累个半死;
有一天某个人给老板开发了个简单的程序,这个程序可以自动将上机的人排序,并在恰当的时间告诉老板哪个家伙时间到了。这个程序大概会是这样:
运行结果:
从上面的运行结果可以看出,程序并没有一遍一遍地扫描队列中的对象,而是在队列中没有对象符合条件时阻塞。
有了这个程序老板邪恶地笑了,他这下子可以舒舒服服地坑爹了。
至于这个好不好用呢,用过才知道,尤其是在并发量比较大的情况下。
DelayQueue 的内部是一个优先队列,从数据结构上看是一个类有序二叉树:
offer、poll、remove()和add------ O(log(n))时间;
remove(Object)和contains(Object) ------线性时间;
peek、element和size-------固定时间
分享到:
相关推荐
在Java编程中,DelayQueue是一种特殊的并发队列,它遵循先进先出(FIFO)原则,但具有一个独特的特性:元素只有在其指定的延迟时间过去之后才能被获取和处理。这个特性使得DelayQueue成为实现定时任务和延迟操作的...
DelayQueue 提供了一个无界的阻塞队列,用于存放实现了 Delayed 接口的对象。 DelayQueue 能够保证队列中的对象是有序的,即队头对象的延迟到期时间最长。 DelayQueue 的使用场景非常广泛,如: 1. 订单业务中,...
**延迟队列(DelayQueue)详解** 在Java的并发编程中,`DelayQueue`是一个非常特殊的队列,它属于并发包`java.util.concurrent`的一部分。`DelayQueue`是一个基于优先级队列(PriorityQueue)实现的无界阻塞队列,...
在向 DelayQueue 队列中添加元素时,会给元素一个 Delay(延迟时间)作为排序条件,队列中最小的元素会优先放在队首。队列中的元素只有到了 Delay 时间才允许从队列中取出。 2. ScheduledExecutorService 延时队列 ...
基于DelayQueue的简单的定时任务队列.zip Quick Start class Main { public static void main(String[] args) { // 初始化任务队列 JobScheduler scheduler = new JobScheduler("default"); // 向队列中提交任务...
`DelayQueue`是Java并发库`java.util.concurrent`中的一个数据结构,它是一个基于优先级队列的无界阻塞队列,可以用于存储具有延迟时间的元素。而Redis则是一个高性能的键值数据库,通过其丰富的数据结构和操作,...
在IT行业中,队列是一种非常基础且重要的数据结构,它遵循先进先出(FIFO,First In First Out)的原则。本篇文章将详细讲解如何高效地实现队列,并结合提供的文件"Quene"来探讨可能的实现方式。 首先,我们要理解...
在IT行业中,延迟队列是一种特殊的消息队列,它允许我们设定消息在特定时间后才被消费,这对于处理定时任务、订单超时、通知发送等场景非常有用。本项目是基于Go语言和Redis实现的延迟队列,借鉴了有赞(Zan)的设计...
整个延迟队列由4个部分组成: 1. JobPool用来存放所有Job的元信息。 2. DelayBucket是一组以时间为维度的有序队列,用来存放所有需要延迟的Job(这里只存放Job Id)。 3. Timer负责实时扫描各个Bucket,并将delay...
2. 使用JDK自带的DelayQueue:这是一个无界阻塞队列,元素需实现Delayed接口,当延迟时间到达时,元素可以从队列中取出。但这种方式不适用于分布式环境。 3. 消息中间件实现,如RabbitMQ:通过设置消息的存活时间...
DelayQueue是一个无界阻塞队列,只有在延迟期满时,才能从中提取元素。它提供了在指定时间才能获取队列元素的功能,队列头元素是最接近过期的元素。DelayQueue的元素需要实现Delayed接口,该接口类定义如下: ...
DelayQueue还可以用于实现生产者消费者模式,生产者将对象放入队列中,而消费者则从队列中取出对象进行处理。 DelayQueue的缺点 DelayQueue的缺点是如果队列中的对象非常多,可能会导致性能下降。同时,如果...
5. DelayQueue:一个延迟阻塞队列,元素只有在延迟时间到期后才能出队。 阻塞队列的选择策略: 1. 根据队列的大小选择合适的阻塞队列。 2. 根据元素的类型选择合适的阻塞队列。 3. 根据线程池的需求选择合适的阻塞...
5. DelayQueue:一个基于PriorityQueue实现的延迟队列,其中的元素只有在过了一定的延迟时间后才能被取走。 6. LinkedTransferQueue和LinkedBlockingDeque:分别为基于链表结构的无界队列,前者提供了多种线程间交换...
例如,Java中的Timer和DelayQueue,可以实现简单的延迟任务。但这种方法一般适用于单机场景,因为它难以应对分布式系统中的复杂环境。 2. 基于数据库的解决方案:在这种方案中,将待处理的任务以记录的形式存储在...
延迟队列,顾名思义它是一种带有延迟功能的消息队列。 那么,是在什么场景下我才需要这样的队列呢? 一、背景 先看看一下业务场景: 1.会员过期前3天发送召回通知 2.订单支付成功后,5分钟后检测下游环节是否都正常...
阻塞队列在Java并发包java.util.concurrent中提供了多种实现,如ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、DelayQueue和SynchronousQueue等,每种阻塞队列都根据其特性适用于不同的场景。...
4. **DelayQueue**:基于优先级队列实现的无界阻塞队列,主要用于处理延迟过期的对象。 5. **SynchronousQueue**:不存储元素的阻塞队列,每次插入必须等待一次移除,反之亦然。 6. **LinkedTransferQueue**:基于...
在Java中,`DelayQueue`是一个无界阻塞队列,用于存储实现了`Delayed`接口的元素。`Delayed`接口要求元素能够提供一个延迟时间,`DelayQueue`在取出元素时会检查是否已达到延迟时间。然而,原生的`DelayQueue`并不...
`BlockingQueue`还提供了`TransferQueue`和`DelayQueue`两个子接口,分别用于支持异步传输和延迟生产元素的队列。 9. **性能优化** 使用`BlockingQueue`可以减少锁的使用,降低锁竞争,从而提高多线程环境下的...