`
zzhonghe
  • 浏览: 243371 次
  • 性别: 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.";
	}
}
分享到:
评论

相关推荐

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

    DelayQueue是一个无界阻塞队列,只有在延迟期满时,才能从中提取元素。这篇文章主要介绍了springboot执行延时任务-DelayQueue的使用,需要的朋友可以参考下

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

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

    java并发工具包详解

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

    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并发工具包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 ...

    消息队列常见面试题 全解

    Timer 是单线程的会有阻塞的风险,并且对异常没有做处理,一个任务出错 Timer 就挂了。而 ScheduledThreadPool 相比于 Timer 首先可以多线程来执行任务,并且线程池对异常做了处理,使得 任务之间不会有影响。 并且 ...

    Java并发编程相关源码集 包括多任务线程,线程池等.rar

    Java并发编程常见知识点源码集锦,涉及到对象锁,Executors多任务线程框架,线程池等... ConcurrentLinkedQueue、DelayQueue示例、自定义的线程拒绝策略、自定义线程池(使用有界队列)、自定义线程池(使用无界队列)。。。

    深入理解Java线程编程中的阻塞队列容器

    1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于...

    java并发编程

    可堵塞队列的功能及行为、 使用API实现压力测试、 CyclicBarrier与Exchanger、 线程池的意义及自定义注意事项、 DelayQueue实现对象的超时管理、 Lock的应用场景及锁分解机制、 自定义堵塞行为的应用、 非阻塞的同步...

    javabitset源码-java_master:后端架构师技术图谱

    阻塞队列:ArrayBlockingQueue(有界)、LinkedBlockingQueue(无界)、DelayQueue、PriorityBlockingQueue,采用锁机制;使用 ReentrantLock 锁。 集合 链表、数组 字典、关联数组 栈 Stack 是线程安全的。 内部使用...

    亚信java笔试题-Book:架构师之路

    阻塞队列:ArrayBlockingQueue(有界)、LinkedBlockingQueue(无界)、DelayQueue、PriorityBlockingQueue,采用锁机制;使用 ReentrantLock 锁。 集合 链表、数组 字典、关联数组 栈 Stack 是线程安全的。 内部使用...

    高级java笔试题-architect-awesome:后端架构师技术图谱

    阻塞队列:ArrayBlockingQueue(有界)、LinkedBlockingQueue(无界)、DelayQueue、PriorityBlockingQueue,采用锁机制;使用 ReentrantLock 锁。 集合 链表、数组 字典、关联数组 栈 Stack 是线程安全的。 内部使用...

    java简易投票系统源码下载-study-way:学习路线

    阻塞队列:ArrayBlockingQueue(有界)、LinkedBlockingQueue(无界)、DelayQueue、PriorityBlockingQueue,采用锁机制;使用 ReentrantLock 锁。 集合 链表、数组 字典、关联数组 栈 Stack 是线程安全的。 内部使用...

    leetcode中国-architect-go:后端架构师技术图谱-go

    阻塞队列:ArrayBlockingQueue(有界)、LinkedBlockingQueue(无界)、DelayQueue、PriorityBlockingQueue,采用锁机制;使用 ReentrantLock 锁。 集合 链表、数组 字典、关联数组 栈 Stack 是线程安全的。 内部使用...

    高级java笔试题-architect:架构师之路

    阻塞队列:ArrayBlockingQueue(有界)、LinkedBlockingQueue(无界)、DelayQueue、PriorityBlockingQueue,采用锁机制;使用 ReentrantLock 锁。 集合 链表、数组 字典、关联数组 栈 Stack 是线程安全的。 内部使用...

    阿里云java短信验证码源码-fenbushi-dititribute:fenbushi-dititribute

    阻塞队列:ArrayBlockingQueue(有界)、LinkedBlockingQueue(无界)、DelayQueue、PriorityBlockingQueue,采用锁机制;使用 ReentrantLock 锁。 集合 链表、数组 字典、关联数组 栈 Stack 是线程安全的。 内部使用...

    java核心知识点整理.pdf

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM .........................

    JAVA核心知识点整理(有效)

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................

Global site tag (gtag.js) - Google Analytics