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

DelayQueue 延时用法

阅读更多
public class Test {
	private static DelayQueue<DelayedTask> dq = new DelayQueue<DelayedTask>();

	public static void main(String[] arg) throws Exception {		
		testDelayQueue();
	}
	
	static class DelayedTask implements Delayed {
		private String title;
		private long delayedInSecond;	
		private long createDateSeconds;
		public DelayedTask(String title,long delayedInSecond) {	
			this.title = title;
			this.delayedInSecond = delayedInSecond;
			this.createDateSeconds = System.currentTimeMillis()/1000;
		}
		
		@Override
		public int compareTo(Delayed o) {
			if (getDelay(TimeUnit.SECONDS) > o.getDelay(TimeUnit.SECONDS) ) {
				return 1;
			}else if(getDelay(TimeUnit.SECONDS) < o.getDelay(TimeUnit.SECONDS)) {
				return -1;
			} else{
				return 0; 
			}
		}

		@Override
		public long getDelay(TimeUnit unit) {	
			long currentInSeconds = System.currentTimeMillis()/1000;
			long diff = createDateSeconds+delayedInSecond - currentInSeconds;			
			return unit.convert(diff, TimeUnit.SECONDS);
		}	
		
		public String toString() {
			return this.title;
		}
	}
	
	private static void testDelayQueue() throws Exception {
	//生产者代码
		dq.put(new DelayedTask("A", 31l));
		dq.put(new DelayedTask("B", 30l));
		dq.put(new DelayedTask("C", 20l));
		dq.put(new DelayedTask("D", 10l));
		
//消费者代码
		while(true) {
			System.out.println(dq.take());
		}
	}
}


输出:
D
C
B
A


重点注意getDelay返回的是超时时间与当前时间的差。


分享到:
评论

相关推荐

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

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

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

    DelayQueue的核心接口是`java.util.concurrent.Delayed`,实现这个接口的类需要提供一个`getDelay(TimeUnit unit)`方法来返回元素还需要等待多久才能被处理。当这个延迟时间到达零时,元素才可从队列中取出。在订单...

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

    DelayQueue是一个基于优先级队列的数据结构,插入的元素必须实现Delayed接口,通过getDelay方法返回剩余延迟时间。当延迟时间到达零时,元素才能被消费。 RabbitMQ实现延时队列的基本原理: RabbitMQ结合消息的TTL...

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

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

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

    Java 延时队列的实现方法 延时队列是一种特殊的队列,它可以根据指定的延迟时间来消费队列中的消息。在 Java 中,实现延时队列有多种方式,以下是六种常见的实现方法: 1. DelayQueue 延时队列 DelayQueue 是 ...

    RabbitMQ延时消息实现方案

    2. 建立延时队列(delayqueue)。配置时要留意以下几点: - 配置队列名字时,建议使用delay.{time}.queue的命名规则以便排序和权限控制。 - 根据需要设置不同的延时时间对应的队列,如delay.1m.queue、delay.5m....

    使用Redis实现延时任务的解决方案

    然而,这种方法的缺点是不能精确控制延时时间,且如果数据需要持久化,可能会导致性能下降。 **调度框架和MySQL进行短间隔轮询** 这是一个简单但可能带来性能瓶颈的方案。系统需要不断查询数据库以检查是否达到执行...

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

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

    java实现一个小程序语句的延迟执行的小demo

    首先,Java提供了多种方式来实现延迟执行,例如使用`java.util.Timer`类、`java.util.concurrent.DelayQueue`或者`java.util.concurrent.ScheduledExecutorService`。这里我们将重点讨论`ScheduledExecutorService`...

    Java延迟队列原理与用法实例详解

    Java延迟队列原理与用法实例详解 Java延迟队列是一种特殊的队列结构,它允许元素在队列中等待一段时间,然后才能被消费。在Java中,延迟队列是通过 DelayQueue 实现的,Delayed 接口定义了延迟队列的元素必须实现的...

    php使用redis的有序集合zset实现延迟队列应用示例

    在实际使用时,我们需要创建`DelayQueue`实例并添加任务,如示例所示: ```php $dq = new DelayQueue('close_order', ['host' =&gt; '127.0.0.1', 'port' =&gt; 6379, 'auth' =&gt; '', 'timeout' =&gt; 60]); $dq-&gt;addTask('...

    互联网延迟队列解决方案设计.pdf

    1. 基于编程语言的解决方案:这种方案通常使用编程语言中提供的定时器、延时队列等组件。例如,Java中的Timer和DelayQueue,可以实现简单的延迟任务。但这种方法一般适用于单机场景,因为它难以应对分布式系统中的...

    jQuery延迟执行的实现方法

    在jQuery中,我们可以使用`setTimeout`、`$.delay`和`$.queue`等方法来实现这一目标。 1. `setTimeout`: `setTimeout`是JavaScript内置的一个函数,它可以接受一个函数和一个时间参数,将在指定的时间毫秒后执行...

    高级Java人才培训专家-05-延迟队列精准发布文章

    - **原理:** `DelayQueue` 是一个支持延时获取元素的阻塞队列,内部利用优先队列实现。 - **局限性:** 若程序异常中断,`DelayQueue` 中的任务将丢失。 - **2. 使用RabbitMQ实现延迟任务:** - **方案:** 结合消息...

Global site tag (gtag.js) - Google Analytics