实现自定义延迟队列需要实现 Delayed 接口,重写 getDelay() 方法
package com.ctyun.sks.test;
import lombok.Getter;
import lombok.Setter;
import java.text.DateFormat;
import java.util.Date;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
/**
* 延迟队列
*
* @author java_user
* @date 2022/6/29 23:10
*/
public class CustomDelayQueue {
//延迟消息队列
private static final DelayQueue delayQueue = new DelayQueue();
public static void main(String[] args) throws InterruptedException {
//调用生产者
producer();
//调用消费者
consumer();
}
//生产者
public static void producer() {
//添加消息
delayQueue.put(new MyDelay(1000, "消息1"));
delayQueue.put(new MyDelay(3000, "消息2"));
}
//消费者
public static void consumer() throws InterruptedException {
System.out.println("开始执行时间:" +
DateFormat.getDateTimeInstance().format(new Date()));
while (!delayQueue.isEmpty()) {
System.out.println(delayQueue.take());
}
System.out.println("结束执行时间:" +
DateFormat.getDateTimeInstance().format(new Date()));
}
/**
* 自定义延迟队列
*/
static class MyDelay implements Delayed {
//延迟截止时间(单位:毫秒)
long delayTime = System.currentTimeMillis();
//lombok
@Getter
@Setter
private String msg;
/**
* 初始化
*
* @param delayTime 设置延迟执行时间
* @param msg 执行的消息
*/
public MyDelay(long delayTime, String msg) {
this.delayTime = (this.delayTime + delayTime);
this.msg = msg;
}
//获取剩余时间
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(delayTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
//队列里元素的排序依据
@Override
public int compareTo(Delayed o) {
return Long.compare(this.getDelay(TimeUnit.MILLISECONDS), o.getDelay(TimeUnit.MILLISECONDS));
}
@Override
public String toString() {
return this.msg;
}
}
}
执行结果:
开始执行时间:2022-6-29 23:16:53
消息1
消息2
结束执行时间:2022-6-29 23:16:56