DelayQueue是BlockingQueue接口的一个实现类之一
这个属于基础性问题,老规矩,我们将从使用场景和代码示例来进行讲解
来,思考片刻,给出你的答案
1,使用场景
- 实现:延迟队列,其中元素只有在其预定时间到达后才可以从队列中取出。
- 场景:适用于延时任务调度,如定时任务、缓存失效处理等。
2,代码示例
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
class DelayedItem implements Delayed {
private long delayTime; // 延迟时间
private long insertionTime; // 加入队列的时间
public DelayedItem(long delay, TimeUnit unit) {
this.delayTime = unit.toNanos(delay);
this.insertionTime = System.nanoTime();
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(delayTime - (System.nanoTime() - insertionTime), TimeUnit.NANOSECONDS);
}
@Override
public int compareTo(Delayed o) {
if (this == o)
return 0;
long diff = (getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS));
return (diff == 0) ? 0 : ((diff < 0) ? -1 : 1);
}
@Override
public String toString() {
return "DelayedItem";
}
}
public class DelayQueueExample {
static final DelayQueue<DelayedItem> queue = new DelayQueue<>();
public static void main(String[] args) throws InterruptedException {
queue.put(new DelayedItem(5, TimeUnit.SECONDS));
Thread consumer = new Thread(() -> {
try {
DelayedItem delayedItem = queue.take(); // 只有延迟时间到了才能取出
System.out.println("Consumed after delay: " + delayedItem);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
consumer.start();
// 等待consumer完成
consumer.join();
}
}
至此,关于BlockingQueue接口的关键实现类也给大伙介绍完毕了
想系统性学习更多进阶的内容,欢迎来加入我的星球