`

JUC并发集合DelayQueue

 
阅读更多

 

DelayQueue 

1. DelayQueue is an unbounded queue. It extends Delayed interface.

2. Element from DelayQueue can only be taken when its delay has expired.

3. At the head of the queue , element with furthest expired delay time is found.

4. An element is expired when its getDelay() method returns a value less than or equal to zero.

5. Null is not permitted in DelayQueue. 

6. In DelayQueue, only those object can be inserted which implements Delayed interface. 

DelayQueue

是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。


示例:

public class DelayQueueTest {
	
	public static void main(String[] args) {
		DelayQueue<DelayElement> queue = new DelayQueue<DelayElement>();
		long now = System.currentTimeMillis();//毫秒
		DelayElement ele1 = new DelayElement(5000+now,"e1");
		queue.offer(ele1);
		DelayElement ele2 = new DelayElement(3000+now,"e2");
		queue.offer(ele2);
		DelayElement ele3 = new DelayElement(2000+now,"e3");
		queue.offer(ele3);
		DelayElement ele4 = new DelayElement(4000+now,"e4");
		queue.offer(ele4);
		
		Iterator<DelayElement> iter = queue.iterator();
		//orignal data
		while(iter.hasNext()){
			DelayElement ele = iter.next();
			System.out.println(ele.name+":"+ele.delayTime);
		}
		//
		/*while(queue.size()>0){
			try {
				DelayElement ele = queue.take();
				System.out.println("current time in ms: " + System.currentTimeMillis() + ", element:" + ele.name); 
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}*/
		/*
		 * 多线程从队列中取数据,DelayQueue根据DelayElement的compareTo()进行排序
		 */
		ExecutorService service = Executors.newFixedThreadPool(3);
		service.execute(new DelayElementCustomer("customer01", queue));
		service.execute(new DelayElementCustomer("customer02", queue));
		service.execute(new DelayElementCustomer("customer03", queue));
		
		service.shutdown();
		System.out.println("pool shutdown now.");
		
	}
}
class DelayElementCustomer implements Runnable{//Runnable
	private DelayQueue<DelayElement> delayQueue = null;
	private String customerName;
	public DelayElementCustomer(String customerName,DelayQueue<DelayElement> delayQueue){
		this.delayQueue = delayQueue;
		this.customerName = customerName;
	}
	
	@Override
	public void run() {
		while(delayQueue.size()>0){
			DelayElement ele = null;
			try {
				ele = delayQueue.poll(1000,TimeUnit.MILLISECONDS);
				if(ele==null){
					System.out.println("delayElement in DelyQueue is not expired now."+this.customerName);
				}else{
					System.out.println("Thread "+this.customerName+" take delayElement "+(ele==null?"null":ele.name));
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			/*try {
				DelayElement ele = delayQueue.take();//queue为空时,线程阻塞。故executorservice.shutDown();一直没有关闭
				System.out.println("Thread "+this.customerName+" take delayElement "+ele.name);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}*/
		}
		System.out.println("Thread end."+this.customerName);
	}
}
class DelayElement implements Delayed{
	public long delayTime = 0L;
	public String name ;
	
	public DelayElement(long delayTime,String name){
		this.delayTime = delayTime;
		this.name = name;
	}
	
	@Override
	public long getDelay(TimeUnit unit) {//unit: TimeUnit.NANOSECONDS
		long delay = unit.convert(this.delayTime-System.currentTimeMillis(), TimeUnit.MILLISECONDS);//MILLISECONDS--> NONOSECONDS
		System.out.println(this.name+"delay long:"+delay);
		return delay;
	}

	@Override
	public int compareTo(Delayed obj) {
		DelayElement other = (DelayElement)obj;
		if(this.delayTime < other.delayTime){
			return -1;
		}else if(this.delayTime>other.delayTime){
			return 1;
		}
		return 0;
	}
	
}

 相关链接:

使用Java的DelayQueue容易碰到的一个坑

xmemcached 1.2.6.2紧急发布(升级到1.2.6.1的朋友注意)

精巧好用的DelayQueue

分享到:
评论

相关推荐

    juc并发编程脑图以及相关示例代码

    juc并发编程脑图以及相关示例代码

    尚硅谷大厂必备技术之JUC并发编程基础视频 配套资料(自己根据视频整理课件,和代码)

    【尚硅谷】大厂必备技术之JUC并发编程视频 配套资料,自己根据视频整理 pdf 课件,和代码 视频地址:...

    根据尚硅谷JUC并发编程(对标阿里P6-P7)视频自己整理的pdf文档

    1、根据尚硅谷JUC并发编程(对标阿里P6-P7)视频自己整理的pdf文档 2、包含源码 视频地址:https://www.bilibili.com/video/BV1ar4y1x727/?p=1&vd_source=c634d163b940964d44747b4c3976117b 参考资料:...

    06、JUC并发工具类在大厂的应用场景详解-ev

    06、JUC并发工具类在大厂的应用场景详解_ev06、JUC并发工具类在大厂的应用场景详解_ev06、JUC并发工具类在大厂的应用场景详解_ev06、JUC并发工具类在大厂的应用场景详解_ev06、JUC并发工具类在大厂的应用场景详解_ev...

    JUC并发编程与源码分析视频课.zip

    3. **并发容器**:如ArrayList、LinkedList、Vector等线程不安全的集合,以及它们的线程安全替代品如ConcurrentHashMap、CopyOnWriteArrayList等。分析这些容器在并发环境下的性能特点和适用场景。 4. **Executor...

    JUC并发编程.rar

    在Java世界中,Java Util Concurrency (JUC) 是一个至关重要的模块,它为开发者提供了丰富的并发工具和机制,使得在多线程环境下编写高效、安全的代码变得可能。"JUC并发编程.rar"这个压缩包文件包含了关于并发编程...

    艾编程coding老师:JUC 并发编程 + 底层原理.pdf

    JUC(java.util.concurrent)是Java提供的一个并发编程工具包,它是为了更高效地处理线程同步和线程间协作而设计的一系列类和接口。JUC从JDK 1.5版本开始被引入,并随着后续版本的更新不断丰富和完善。JUC的出现极大...

    JUC并发编程.md

    ### JUC并发编程知识点 #### 一、JUC并发编程简介 JUC(Java Util Concurrency)是Java标准库中的一个子包,提供了一系列高级并发工具类和接口,旨在简化多线程编程的复杂性。它包括了各种锁机制、线程池、信号量...

    狂神JUC并发笔记大全+Linux等资料

    JUC(Java Util Concurrency)是Java提供的并发工具包,包含了许多高级并发组件,如Semaphore(信号量)、CyclicBarrier(回环栅栏)、CountDownLatch(计数器门锁)等,它们极大地简化了并发编程的复杂性。"狂神JUC...

    尚硅谷阳哥JUC并发编程2022版本脑图笔记

    尚硅谷阳哥JUC并发编程2022版本脑图笔记

    java高级技术JUC高并发编程教程2021(1.5G)

    java高级技术JUC高并发编程教程2021(1.5G) 〖课程介绍〗: java高级技术JUC高并发编程教程2021(1.5G) 〖课程目录〗:   01-JUC高并发编程-课程介绍.mp4 02-JUC高并发编程-JUC概述和进程线程概念(1).mp4 03-JUC...

    JUC并发编程学习笔记(硅谷)

    "JUC并发编程学习笔记(硅谷)"很可能包含了关于Java并发工具集(Java Util Concurrency, JUC)的深入理解和实战经验。JUC是Java标准库提供的一套强大的并发处理工具,它极大地简化了多线程编程,提高了程序的可读性...

    JUC并发工具包实例.zip

    Java并发工具包(Java Concurrency Utility,简称JUC)是Java平台中用于高效并发编程的重要模块,它在`java.util.concurrent`包下提供了一系列高级并发工具。这些工具可以帮助开发者更好地管理和控制多线程环境,...

    6、JUC并发工具类在大厂的应用场景详解(1).pdf

    ### JUC并发工具类在大型企业的应用场景详解 #### 一、引言 随着现代软件系统对高并发处理能力的需求日益增长,如何有效地管理和控制多线程间的协作与竞争成为了一个重要课题。Java语言自1.5版本引入了`java.util....

    Java后端开发,JUC并发编程Java后端开发,JUC并发编程

    ### Java后端开发与JUC并发编程 #### 进程和线程的概念 在Java后端开发与JUC(Java.util.concurrent包)并发编程中,进程和线程是两个核心概念。 **进程**是系统进行资源分配的基本单位,具有并发性、异步性、...

    JUC并发编程视频教程

    * 颠覆一些你以为"正确"的认知,纠正其它同类视频的错误* 100+ 张手绘图 & 流程图,帮助你形成正确的"多线程世界观"* 以知识点为主线、穿插讲解"应用","原理"和"多线程设计模式",多维度学懂并发主讲内容第一章:...

    JUC代码收集,java高并发多线程学习

    1. **concurrent**:这是JUC库的主要部分,提供了线程池、同步容器、并发集合等类。例如: - `ExecutorService`和`ThreadPoolExecutor`:它们构成了线程池的基础,允许开发者有效地管理和调度线程,避免过度创建...

    Java多线程(Synchronized+Volatile+JUC 并发工具原理+线程状态+CAS+线程池)

    Java 多线程(Synchronized+Volatile+JUC 并发工具原理+线程状态+CAS+线程池) Java 多线程是 Java 语言中的一种并发编程机制,允许程序同时执行多个线程,以提高程序的执行效率和响应速度。 Java 多线程机制提供了...

Global site tag (gtag.js) - Google Analytics