【Java笔记】实现延时队列(小结):JDK DelayQueue&MQ&Redis
在Java中实现延时队列,可以使用JDK自带的DelayQueue
,也可以借助消息队列(如RabbitMQ)或者外部存储(如Redis)实现。以下是这三种方式的简要代码示例:
- 使用JDK自带的
DelayQueue
:
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class DelayQueueExample {
public static void main(String[] args) {
DelayQueue<DelayedTask> queue = new DelayQueue<>();
queue.put(new DelayedTask("Task 1", System.currentTimeMillis() + 5000));
queue.put(new DelayedTask("Task 2", System.currentTimeMillis() + 10000));
while (!queue.isEmpty()) {
try {
DelayedTask task = queue.take();
System.out.println("Executing: " + task.getName() + ", Time: " + System.currentTimeMillis());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
static class DelayedTask implements Delayed {
private String name;
private long expireTime;
public DelayedTask(String name, long expireTime) {
this.name = name;
this.expireTime = expireTime;
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(this.expireTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
DelayedTask other = (DelayedTask) o;
return Long.compare(this.expireTime, other.expireTime);
}
public String getName() {
return name;
}
}
}
- 使用消息队列(如RabbitMQ):
// 使用RabbitMQ的延时队列特性,需要在RabbitMQ中进行配置。
- 使用外部存储(如Redis):
// 使用Redis的有序集合(ZSET)特性,将任务以score(延时时间戳)存储,然后轮询执行。
以上代码示例分别展示了如何使用JDK自带的DelayQueue
、借助消息队列和外部存储实现延时队列。实际应用中,需要根据具体需求和环境选择合适的方案。
评论已关闭