原文链接 https://www.treeroot.tech/archives/DelayQueue
DelayQueue
概述
我们一般业务需求会有延迟任务的需求,简单的可以使用Timer, 但是Timer支持单线程,如果使用希望多线程执行任务的话可以使用ScheduledThreadPoolExecutor,这两个还都属于内存版的消息队列,如果希望消息持久化保存,则可以选择quartz(可以配置数据库保存消息),以及MQ等,今天先说说Timer和ScheduledThreadPoolExecutor的实现,这两个的实现内部使用了类似DelayQueue的队列,所以先看看DelayQueue的原理。
基本介绍
其实DelayQueue是一个BlockingQueue和PriorityQueue的结合,也就是阻塞队列和优先级队列, 阻塞队列是可以实现获取队列元素时,如果队列为空会阻塞当前读取的线程而优先级队列其实就是对于加入的队列的元素会进行排序(使用堆排序),所以加入优先级队列的元素必须实现Comparable接口,如果队列是有序的那就好办了,当先写入一个 100秒执行的任务最后在写入一个10秒的任务,那么10秒任务会排在100秒任务之前,这有什么用呢,先让我们看看这个Demo,下面会解释。
public class Main {
public static void main(String[] args) {
DelayQueue<DelayTask> delayQueue = new DelayQueue<>();
delayQueue.offer(new DelayTask(20000));
delayQueue.offer(new DelayTask(10000) );
new Thread(() -> {
while (true) {
try {
DelayTask task = delayQueue.take();
System