`
zzhonghe
  • 浏览: 248231 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

阻塞任务队列DelayQueue

    博客分类:
  • Java
阅读更多
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.";
	}
}
分享到:
评论

相关推荐

    JDK自带的延迟队列-DelayQueue

    `DelayQueue`是一个基于优先级队列(PriorityQueue)实现的无界阻塞队列,它的主要特性是元素只有在达到指定延迟时间后才能被消费。这种队列常用于实现定时任务调度、缓存过期策略等场景。 1. **延迟元素的概念** ...

    DelayQueue、Redis结合使延迟、定时任务使用源代码

    `DelayQueue`是Java并发库`java.util.concurrent`中的一个数据结构,它是一个基于优先级队列的无界阻塞队列,可以用于存储具有延迟时间的元素。而Redis则是一个高性能的键值数据库,通过其丰富的数据结构和操作,...

    springboot执行延时任务之DelayQueue的使用详解

    DelayQueue是一个无界阻塞队列,只有在延迟期满时,才能从中提取元素。它提供了在指定时间才能获取队列元素的功能,队列头元素是最接近过期的元素。DelayQueue的元素需要实现Delayed接口,该接口类定义如下: ...

    java利用delayedQueue实现本地的延迟队列

    DelayQueue 提供了一个无界的阻塞队列,用于存放实现了 Delayed 接口的对象。 DelayQueue 能够保证队列中的对象是有序的,即队头对象的延迟到期时间最长。 DelayQueue 的使用场景非常广泛,如: 1. 订单业务中,...

    一个小的java Demo , 非常适合Java初学者学习阅读.rar

    数组阻塞队列ArrayBlockingQueue,延迟队列DelayQueue, 链阻塞队列 LinkedBlockingQueue,具有优先级的阻塞队列 PriorityBlockingQueue, 同步队列 SynchronousQueue,阻塞双端队列 BlockingDeque, 链阻塞双端队列 ...

    14-阻塞队列BlockingQueue实战及其原理分析二.pdf

    5. DelayQueue:一个延迟阻塞队列,元素只有在延迟时间到期后才能出队。 阻塞队列的选择策略: 1. 根据队列的大小选择合适的阻塞队列。 2. 根据元素的类型选择合适的阻塞队列。 3. 根据线程池的需求选择合适的阻塞...

    阻塞队列(Blocking Queue)是一个支持两个附加操作的队列.txt

    线程池中的工作线程会从队列中取出任务执行,当任务量超过线程池处理能力时,多出的任务会被暂存在线程池维护的阻塞队列中。 - 生产者消费者模式:这是并发编程中的一个经典模式。生产者负责产生数据并存入阻塞队列...

    java并发工具包详解

    4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 Synchronou sQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 ...

    10、阻塞队列BlockingQueue实战及其原理分析.pdf

    4. **DelayQueue**:基于优先级队列实现的无界阻塞队列,主要用于处理延迟过期的对象。 5. **SynchronousQueue**:不存储元素的阻塞队列,每次插入必须等待一次移除,反之亦然。 6. **LinkedTransferQueue**:基于...

    java并发工具包 java.util.concurrent中文版用户指南pdf

    4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque ...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf

    延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque 10...

    Java并发编程(21)并发新特性-阻塞队列和阻塞栈(含代

    4. `DelayQueue`: 一个基于优先级队列的阻塞队列,元素只有在其延迟时间到期后才能被获取。 **阻塞栈(BlockingDeque)** 阻塞栈,即阻塞双端队列(BlockingDeque),在Java中由`LinkedBlockingDeque`实现。它同时...

    高效的实现队列

    在实际应用中,队列常被用于任务调度、消息传递、网络缓冲区管理等场景。例如,在操作系统中,进程调度就是基于优先级队列实现的;在消息中间件中,消息通常存储在队列中,等待消费。 总之,高效地实现队列需要考虑...

    高效延时队列的设计与实现

    2. 使用JDK自带的DelayQueue:这是一个无界阻塞队列,元素需实现Delayed接口,当延迟时间到达时,元素可以从队列中取出。但这种方式不适用于分布式环境。 3. 消息中间件实现,如RabbitMQ:通过设置消息的存活时间...

    剖析Java中阻塞队列的实现原理及应用场景

    Java中的阻塞队列是一种特殊的线程安全的数据结构,它在多线程环境下用于高效地处理生产者-消费者问题。阻塞队列的核心特性在于当队列为空时,尝试获取元素的线程会被阻塞,直到队列中有元素可用;同样,当队列满时...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版

    4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque ...

    java并发包资源

    4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque ...

    Java中的阻塞队列详细介绍

    4. **DelayQueue**:无界的阻塞队列,队列中的元素必须实现Delayed接口,以指定元素的延迟时间。只有在延迟时间结束后,元素才能被取出。这使得DelayQueue非常适合用于实现缓存系统或者定时任务调度。 5. **...

    java学习(基于Java阻塞队列的搜索实例).pdf

    在Java中,`java.util.concurrent`包提供了多种阻塞队列实现,包括`LinkedBlockingQueue`、`ArrayBlockingQueue`、`PriorityBlockingQueue`和`DelayQueue`。 `ArrayBlockingQueue`是一个有界的并发队列,它在创建时...

    一口气说出Java 6种延时队列的实现方法(面试官也得服)

    DelayQueue 是一个 BlockingQueue,无界阻塞队列,内部使用的是 PriorityQueue,PriorityQueue 使用完全二叉堆来实现队列元素排序。在向 DelayQueue 队列中添加元素时,会给元素一个 Delay(延迟时间)作为排序条件...

Global site tag (gtag.js) - Google Analytics