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返回的是超时时间与当前时间的差。
分享到:
相关推荐
Spring Boot延时任务之DelayQueue的使用详解 DelayQueue是一个无界阻塞队列,只有在延迟期满时,才能从中提取元素。它提供了在指定时间才能获取队列元素的功能,队列头元素是最接近过期的元素。DelayQueue的元素...
DelayQueue的核心接口是`java.util.concurrent.Delayed`,实现这个接口的类需要提供一个`getDelay(TimeUnit unit)`方法来返回元素还需要等待多久才能被处理。当这个延迟时间到达零时,元素才可从队列中取出。在订单...
DelayQueue是一个基于优先级队列的数据结构,插入的元素必须实现Delayed接口,通过getDelay方法返回剩余延迟时间。当延迟时间到达零时,元素才能被消费。 RabbitMQ实现延时队列的基本原理: RabbitMQ结合消息的TTL...
我们可以将 Task 对象添加到 DelayQueue 中,并使用.take()方法来获取队头对象,并执行对应的任务。 ``` queue.put(new Task(30 * 1000, new Runnable() { public void run() { System.out.println("执行任务"); ...
Java 延时队列的实现方法 延时队列是一种特殊的队列,它可以根据指定的延迟时间来消费队列中的消息。在 Java 中,实现延时队列有多种方式,以下是六种常见的实现方法: 1. DelayQueue 延时队列 DelayQueue 是 ...
2. 建立延时队列(delayqueue)。配置时要留意以下几点: - 配置队列名字时,建议使用delay.{time}.queue的命名规则以便排序和权限控制。 - 根据需要设置不同的延时时间对应的队列,如delay.1m.queue、delay.5m....
然而,这种方法的缺点是不能精确控制延时时间,且如果数据需要持久化,可能会导致性能下降。 **调度框架和MySQL进行短间隔轮询** 这是一个简单但可能带来性能瓶颈的方案。系统需要不断查询数据库以检查是否达到执行...
重点介绍了ScheduledThreadPoolExecutor的内部工作机制,如何使用DelayQueue来存储等待执行的任务。DelayQueue内部实现了一个基于时间优先级的PriorityQueue,保证任务能按计划时间顺序执行。文档还详细描述了任务...
首先,Java提供了多种方式来实现延迟执行,例如使用`java.util.Timer`类、`java.util.concurrent.DelayQueue`或者`java.util.concurrent.ScheduledExecutorService`。这里我们将重点讨论`ScheduledExecutorService`...
Java延迟队列原理与用法实例详解 Java延迟队列是一种特殊的队列结构,它允许元素在队列中等待一段时间,然后才能被消费。在Java中,延迟队列是通过 DelayQueue 实现的,Delayed 接口定义了延迟队列的元素必须实现的...
在实际使用时,我们需要创建`DelayQueue`实例并添加任务,如示例所示: ```php $dq = new DelayQueue('close_order', ['host' => '127.0.0.1', 'port' => 6379, 'auth' => '', 'timeout' => 60]); $dq->addTask('...
1. 基于编程语言的解决方案:这种方案通常使用编程语言中提供的定时器、延时队列等组件。例如,Java中的Timer和DelayQueue,可以实现简单的延迟任务。但这种方法一般适用于单机场景,因为它难以应对分布式系统中的...
在jQuery中,我们可以使用`setTimeout`、`$.delay`和`$.queue`等方法来实现这一目标。 1. `setTimeout`: `setTimeout`是JavaScript内置的一个函数,它可以接受一个函数和一个时间参数,将在指定的时间毫秒后执行...
- **原理:** `DelayQueue` 是一个支持延时获取元素的阻塞队列,内部利用优先队列实现。 - **局限性:** 若程序异常中断,`DelayQueue` 中的任务将丢失。 - **2. 使用RabbitMQ实现延迟任务:** - **方案:** 结合消息...