`
臻是二哥
  • 浏览: 188531 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
Group-logo
Java技术分享
浏览量:0
社区版块
存档分类
最新评论

DelayQueue

    博客分类:
  • JAVA
阅读更多
DelayQueue就是一个优先级队列,他的优先级按照里面元素的延迟时间来决定,延迟时间小的(也就是时间先到的)放在队列头(这与add的顺序无关),与元素本身的属性值有关。

DelayQueue中的元素必须是实现了Delayed接口的,而Delayed接口又是Comparable的子接口,因此DelayQueue中的元素必须覆盖Delayed接口的getDelay(TimeUnit)方法和Comparable的compareTo()方法,其实两个方法的实现都很简单。

前者:
public long getDelay(TimeUnit tu)
{
  return time.System.currentTimeMillis();
}
后者:
public int compareTo(Delayed d)
{
    T t=(T)d;
    if(time<d.getTime())//如果自己比人家小,返回负值
       return -1;
    else if(time>d.getTime())//如果自己比人家大,返回正值
       return 1;
    else return 0;
}


关于DelayQueue的代码如下:
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.DelayQueue;
public class TestDelayQueue
{
	public static void checkin(Customer cus,DelayQueue queue)
	{
		queue.add(cus);
		System.out.println("网民"+cus.getId()+":开始上机");
	}
	public static void main(String [] args)
	{
		DelayQueue<Customer> queue=new DelayQueue<Customer>();
		Customer cus1=new Customer("1",10000+System.currentTimeMillis());
		Customer cus2=new Customer("2",50000+System.currentTimeMillis());
		Customer cus3=new Customer("3",20000+System.currentTimeMillis());
		checkin(cus1,queue);
		checkin(cus2,queue);
		checkin(cus3,queue);
		while(queue.size()>0)
		{
			try
			{
				Customer off=queue.take();
				System.out.println("网民"+off.getId()+":下机");		
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
		}
		System.out.println("网吧内已经没有顾客");
	}
}
class Customer implements Delayed
{
	private String id;
	private long time;
	public Customer(String id,long time)
	{
		this.id=id;
		this.time=time;
	}
	public String getId()
	{
		return this.id;
	}
	public long getTime()
	{
		return time;
	}
	public long getDelay(TimeUnit tu)
	{
		return time-System.currentTimeMillis();
	}
	public int compareTo(Delayed d)//当前比外来户小返回负值,当前比外来户大返回正值
	{
		Customer c=(Customer)d;
		if(time>c.getTime())
			return 1;
		else if(time<c.getTime())
			return -1;
		else 
			return 0;		
	}
}
   


大家会发现,Customer中有个属性time,这个属性是绝对时间,即希望当前对象被执行的时间,getDelay是覆盖Delayed的函数,这个函数返回相对的时间,系统也正是利用这个来判断还有多长时间要执行某个对象。而compareTo用来确定队列中对象的先后顺序,当然希望从小打到大排序。
0
0
分享到:
评论

相关推荐

    DelayQueue延迟队列和Redis缓存实现订单自动取消功能

    在Java编程中,DelayQueue是一种特殊的并发队列,它遵循先进先出(FIFO)原则,但具有一个独特的特性:元素只有在其指定的延迟时间过去之后才能被获取和处理。这个特性使得DelayQueue成为实现定时任务和延迟操作的...

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

    本文将深入探讨如何利用Java中的`DelayQueue`和Redis来实现这一功能。`DelayQueue`是Java并发库`java.util.concurrent`中的一个数据结构,它是一个基于优先级队列的无界阻塞队列,可以用于存储具有延迟时间的元素。...

    DelayQueue的使用以及注意事项

    DelayQueue的使用以及注意事项,这里需要由BlockingQueue的基本知识,一般的Queue的使用方法poll(),take(),drainTo()和offer(),put()这些应该懂。

    JDK自带的延迟队列-DelayQueue

    **延迟队列(DelayQueue)详解** 在Java的并发编程中,`DelayQueue`是一个非常特殊的队列,它属于并发包`java.util.concurrent`的一部分。`DelayQueue`是一个基于优先级队列(PriorityQueue)实现的无界阻塞队列,...

    基于DelayQueue的简单的定时任务队列.zip

    基于DelayQueue的简单的定时任务队列.zip Quick Start class Main { public static void main(String[] args) { // 初始化任务队列 JobScheduler scheduler = new JobScheduler("default"); // 向队列中提交任务...

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

    Spring Boot延时任务之DelayQueue的使用详解 DelayQueue是一个无界阻塞队列,只有在延迟期满时,才能从中提取元素。它提供了在指定时间才能获取队列元素的功能,队列头元素是最接近过期的元素。DelayQueue的元素...

    Java多线程并发开发之DelayQueue使用示例

    "Java多线程并发开发之DelayQueue使用示例" DelayQueue是Java多线程并发开发中的一种常用的数据结构,它是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象。DelayQueue的主要作用是按照对象的延迟时间...

    基于SpringBoot的延迟消息Starter设计源码,支持DelayQueue、Redisson、RabbitMQ三种方式

    该项目是SpringBoot框架下的延迟消息Starter,提供对DelayQueue、Redisson和RabbitMQ三种延迟消息机制的集成支持。项目包含32个文件,涵盖24个Java源文件、4个XML配置文件、1个Git忽略文件、1个Markdown文件、1个...

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

    DelayQueue&lt;Task&gt; queue = new DelayQueue(); ``` 我们可以将 Task 对象添加到 DelayQueue 中,并使用.take()方法来获取队头对象,并执行对应的任务。 ``` queue.put(new Task(30 * 1000, new Runnable() { ...

    delay-queue:JDK实现的本地delayQueue和基于分布式Redis的两种分布式

    local delayQueue implemented by JDK & two kinds of distributed delayQueue based redis 1. 基本介绍 RedisSynDelayQueue 基于redis,并发情况下会加分布式锁,单线程场景(syn=false)性能较好, 并发场景性能较...

    php-delayqueue:基于redis实现高可用,易拓展,接入方便,生产环境稳定运行的延迟队列

    延迟队列,顾名思义它是一种带有延迟功能的消息队列。 那么,是在什么场景下我才需要这样的队列呢? 一、背景 先看看一下业务场景: 1.会员过期前3天发送召回通知 2.订单支付成功后,5分钟后检测下游环节是否都正常...

    Delayed interface and Delay Queue

    标题 "Delayed interface and Delay Queue" 涉及到Java并发编程中的两个重要概念:Delayed接口和DelayQueue。这篇博文可能是作者Tomboxfan在iteye博客上分享关于这两个概念的深入理解和应用实例。 Delayed接口是...

    定时任务与线程池:并发编程的关键

    重点介绍了ScheduledThreadPoolExecutor的内部工作机制,如何使用DelayQueue来存储等待执行的任务。DelayQueue内部实现了一个基于时间优先级的PriorityQueue,保证任务能按计划时间顺序执行。文档还详细描述了任务...

    Go-delay-queue基于Redis实现的延迟队列

    在IT行业中,延迟队列是一种特殊的消息队列,它允许我们设定消息在特定时间后才被消费,这对于处理定时任务、订单超时、通知发送等场景非常有用。本项目是基于Go语言和Redis实现的延迟队列,借鉴了有赞(Zan)的设计...

    JAVA并发容器代码随读1

    不同的并发容器根据其设计目的和应用场景,采用不同的实现方式,如 BlockingQueue 的阻塞等待、DelayQueue 的延迟处理、ConcurrentMap 的分段锁、以及 CopyOnWrite 系列的写时复制。理解和掌握这些并发容器的原理和...

    延时队列我在项目里是怎么实现的?.doc

    在Java中,`DelayQueue`是一个无界阻塞队列,用于存储实现了`Delayed`接口的元素。`Delayed`接口要求元素能够提供一个延迟时间,`DelayQueue`在取出元素时会检查是否已达到延迟时间。然而,原生的`DelayQueue`并不...

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

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

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

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

    java.util.concurrent_您不知道的5件事

    ### Java.util.concurrent_您不知道的5件事 #### 1. Semaphore(信号量) - **定义与作用**:`Semaphore` 类是一种控制多个线程访问共享资源的机制,它通过内部维护一个整数计数器(许可的数量)以及一组等待线程...

Global site tag (gtag.js) - Google Analytics