DelayQueue
DelayQueue 的性质:
它是一个线程安全的队列。
包含 PriorityQueue 的性质。
放入该队列的元素必须实现 Delayed 接口
从该队列取出对象时,需要询问对象的执行延迟。即队头不为 null 条件还不充分,还需要剩余延迟 delay <= 0,对象才能正常出队。这点比较特殊。
Delayed 接口
Delayed 用于标记在给定延迟后应执行操作的对象。
public interface Delayed extends Comparable {
long getDelay(TimeUnit unit);
getDelay 方法的实现中并不需要阻塞,只需要返回给定时间单位中与此对象关联的剩余延迟。
public interface ScheduledFuture extends Delayed, Future {}
比如实现 ScheduledFuture 接口的对象就可以做 DelayQueue 的元素。
他包含的关键成员变量
// 可重入锁, 不参与序列化和反序列化
private final transient lock = new ReentrantLock();
// 依赖优先级队列,在此基础上封装线程安全的逻辑
private final PriorityQueue q = new PriorityQueue();
// 指定在队列头等待元素的线程。
private Thread leader = null;
// 条件锁:当一个较新的元素在队列头变得可用或一个新线程可能需要成为 leader 时发出的状态信号。
private final Condition available = lock.newCondition();
poll 立即出队
public E poll() {
final ReentrantLock lock = this.lock;
lock.lock();
try {
// 获取队首元素,但不从队列中移除
E first = q.peek();
// 条件一:first == null
// 条件不成立:队首元素不为 null,队列中至少包含一个元素。进入 else 逻辑
// 条件成立:队列中没有元素
// 条件二:first.getDelay(NANOSECONDS) > 0
// 条件成立&