DelayQueue也和其他阻塞队列一样,采用put和take进行存储。但有意思的是,这个队列里面所存储的对象都带有一个时间参数,采用take获取数据的时候,如果时间没有到,取不出来任何数据。而加入数据的时候,是不会阻塞的。
一般用在清理超时对象的场景:
比如,有一批对象,用完后存入(offer)这个队列,并设定60秒delay(超时), 然后有个线程在外面拼命的take,如果有任何对象被take出来,就清理。只有那些被限制超过60秒的,才会被take.
除此之外,DelayQueue中的对象,还可以通过iterator进行访问,因此,它非常适合用在以下这种场景: 当我们有一组资源,每个资源都有自己的超时策略,我们每次使用资源的时候,都需要用到所有未超时的资源。(比如,server push中的client session)通过把这组资源放入DelayQueue,然后开个Thread不断take,能take出资源,就清理。需要注意的是iterator方法,和clean的方法需要块同步一下。
public class DeplayQueueTest {
public static void main(String args[]){
DelayQueue queue=new DelayQueue();
for(int i=0;i<20;i++){
long delay=(long)(Math.random()*20000);
queue.offer(new DelayTask(delay,queue,i));
}
Executors.newCachedThreadPool().execute(new Consumer(queue));
}
}
class Consumer implements Runnable{
DelayQueue q;
public Consumer(DelayQueue _q){
q=_q;
}
public void run() {
while(true){
try {
System.out.println((DelayTask)(q.take()));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class DelayTask implements Delayed{
private static int count=0;
private int id=count++;
private long nanoTime=System.nanoTime();
private long delayInMilliseconds;
private long triger;
private DelayQueue q;
private int order;
public DelayTask(long _delay,DelayQueue _q,int _order){
order=_order;
q=_q;
this.delayInMilliseconds=_delay;
triger=nanoTime+TimeUnit.NANOSECONDS.convert(_delay,TimeUnit.MILLISECONDS);
}
/* (non-Javadoc)
* @see java.util.concurrent.Delayed#getDelay(java.util.concurrent.TimeUnit)
*/
public long getDelay(TimeUnit unit) {
return triger-System.nanoTime();
}
/* (non-Javadoc)
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
public int compareTo(Object o) {
DelayTask delayTask=(DelayTask)o;
return triger>delayTask.triger?1:triger<delayTask.triger?-1:0;
}
public String toString(){
return "Task#"+id+" in index "+order+": delaying "+delayInMilliseconds+" miliseconds picked up.";
}
}
分享到:
相关推荐
`DelayQueue`是一个基于优先级队列(PriorityQueue)实现的无界阻塞队列,它的主要特性是元素只有在达到指定延迟时间后才能被消费。这种队列常用于实现定时任务调度、缓存过期策略等场景。 1. **延迟元素的概念** ...
`DelayQueue`是Java并发库`java.util.concurrent`中的一个数据结构,它是一个基于优先级队列的无界阻塞队列,可以用于存储具有延迟时间的元素。而Redis则是一个高性能的键值数据库,通过其丰富的数据结构和操作,...
DelayQueue是一个无界阻塞队列,只有在延迟期满时,才能从中提取元素。它提供了在指定时间才能获取队列元素的功能,队列头元素是最接近过期的元素。DelayQueue的元素需要实现Delayed接口,该接口类定义如下: ...
DelayQueue 提供了一个无界的阻塞队列,用于存放实现了 Delayed 接口的对象。 DelayQueue 能够保证队列中的对象是有序的,即队头对象的延迟到期时间最长。 DelayQueue 的使用场景非常广泛,如: 1. 订单业务中,...
数组阻塞队列ArrayBlockingQueue,延迟队列DelayQueue, 链阻塞队列 LinkedBlockingQueue,具有优先级的阻塞队列 PriorityBlockingQueue, 同步队列 SynchronousQueue,阻塞双端队列 BlockingDeque, 链阻塞双端队列 ...
5. DelayQueue:一个延迟阻塞队列,元素只有在延迟时间到期后才能出队。 阻塞队列的选择策略: 1. 根据队列的大小选择合适的阻塞队列。 2. 根据元素的类型选择合适的阻塞队列。 3. 根据线程池的需求选择合适的阻塞...
线程池中的工作线程会从队列中取出任务执行,当任务量超过线程池处理能力时,多出的任务会被暂存在线程池维护的阻塞队列中。 - 生产者消费者模式:这是并发编程中的一个经典模式。生产者负责产生数据并存入阻塞队列...
4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 Synchronou sQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 ...
4. **DelayQueue**:基于优先级队列实现的无界阻塞队列,主要用于处理延迟过期的对象。 5. **SynchronousQueue**:不存储元素的阻塞队列,每次插入必须等待一次移除,反之亦然。 6. **LinkedTransferQueue**:基于...
4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque ...
延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque 10...
4. `DelayQueue`: 一个基于优先级队列的阻塞队列,元素只有在其延迟时间到期后才能被获取。 **阻塞栈(BlockingDeque)** 阻塞栈,即阻塞双端队列(BlockingDeque),在Java中由`LinkedBlockingDeque`实现。它同时...
在实际应用中,队列常被用于任务调度、消息传递、网络缓冲区管理等场景。例如,在操作系统中,进程调度就是基于优先级队列实现的;在消息中间件中,消息通常存储在队列中,等待消费。 总之,高效地实现队列需要考虑...
2. 使用JDK自带的DelayQueue:这是一个无界阻塞队列,元素需实现Delayed接口,当延迟时间到达时,元素可以从队列中取出。但这种方式不适用于分布式环境。 3. 消息中间件实现,如RabbitMQ:通过设置消息的存活时间...
Java中的阻塞队列是一种特殊的线程安全的数据结构,它在多线程环境下用于高效地处理生产者-消费者问题。阻塞队列的核心特性在于当队列为空时,尝试获取元素的线程会被阻塞,直到队列中有元素可用;同样,当队列满时...
4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque ...
4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque ...
4. **DelayQueue**:无界的阻塞队列,队列中的元素必须实现Delayed接口,以指定元素的延迟时间。只有在延迟时间结束后,元素才能被取出。这使得DelayQueue非常适合用于实现缓存系统或者定时任务调度。 5. **...
在Java中,`java.util.concurrent`包提供了多种阻塞队列实现,包括`LinkedBlockingQueue`、`ArrayBlockingQueue`、`PriorityBlockingQueue`和`DelayQueue`。 `ArrayBlockingQueue`是一个有界的并发队列,它在创建时...
DelayQueue 是一个 BlockingQueue,无界阻塞队列,内部使用的是 PriorityQueue,PriorityQueue 使用完全二叉堆来实现队列元素排序。在向 DelayQueue 队列中添加元素时,会给元素一个 Delay(延迟时间)作为排序条件...