DelayQueue是一种延迟队列,它的元素必须实现Delayed接口,该接口定义了一个getDelay方法,用于返回元素的剩余延迟时间。DelayQueue会根据元素的延迟时间排序,只有当元素的延迟时间为0或负数时,才能从队列中获取。
DelayQueue可以用于实现定时任务、缓存过期等场景。例如,下面的代码创建了一个DelayQueue,并向其中添加了四个元素,每个元素有不同的延迟时间。然后从队列中循环获取元素,并打印出来。
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
// 定义一个延迟任务类,实现Delayed接口
class DelayTask implements Delayed {
// 任务名称
private String name;
// 任务执行时间(毫秒)
private long executeTime;
// 构造方法,传入任务名称和延迟时间(秒)
public DelayTask(String name, long delay) {
this.name = name;
// 将延迟时间转换为执行时间
this.executeTime = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(delay);
}
@Override
public long getDelay(TimeUnit unit) {
// 返回剩余延迟时间
return unit.convert(executeTime - 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 "DelayTask{" +
"name='" + name + '\'' +
", executeTime=" + executeTime +
'}';
}
}
public class DelayQueueDemo {
public static void main(String[] args) {
// 创建一个延迟队列
DelayQueue<DelayTask> dq = new DelayQueue<>();
// 向队列中添加四个元素,注意它们的延迟时间
dq.offer(new DelayTask("task1", 5));
dq.offer(new DelayTask("task2", 2));
dq.offer(new DelayTask("task3", 7));
dq.offer(new DelayTask("task4", 3));
// 从队列中循环获取元素,并打印出来
while (dq.size() > 0) {
try {
System.out.println(dq.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
输出结果:
DelayTask{name='task2', executeTime=1645185003739}
DelayTask{name='task4', executeTime=1645185005739}
DelayTask{name='task1', executeTime=1645185007739}
DelayTask{name='task3', executeTime=1645185011739}
可以看到,队列中的元素按照延迟时间的顺序被获取,即先获取延迟时间最短的元素,后获取延迟时间最长的元素。