前言

DelayQueue是BlockingQueue接口的实现类,它是带有延时性能的无界阻塞队列,意思就是每个元素都有过期工夫,当从队列获取元素时,只有过期元素才会出队列。队列的头部元素是最快要过期的元素。

实现原理

先来看看它的类构造:

public class DelayQueue<E extends Delayed> extends AbstractQueue<E>    implements BlockingQueue<E> {}

能够看到,寄存的元素必须实现了Delayed接口,它的定义如下:

public interface Delayed extends Comparable<Delayed> {  long getDelay(TimeUnit unit);}

再来看要害属性:

private final transient ReentrantLock lock = new ReentrantLock();private final PriorityQueue<E> q = new PriorityQueue<E>();private Thread leader = null;private final Condition available = lock.newCondition();

再来看重要办法:
offer()

public boolean offer(E e) {    final ReentrantLock lock = this.lock;    lock.lock();    try {         q.offer(e);         if (q.peek() == e) {             leader = null;             available.signal();         }         return true;    } finally {        lock.unlock();    }}

poll()

public E poll() {    final ReentrantLock lock = this.lock;    lock.lock();    try {        E first = q.peek();        if (first == null || first.getDelay(NANOSECONDS) > 0)            return null;        else             return q.poll();    } finally {        lock.unlock();    }}

take()

public E take() throws InterruptedException {    final ReentrantLock lock = this.lock;    lock.lockInterruptibly();    try {        for (;;) {            E first = q.peek();            if (first == null)                available.await();            else {                long delay = first.getDelay(NANOSECONDS);                if (delay <= 0)                    return q.poll();                first = null; // don't retain ref while waiting                if (leader != null)                    available.await();                else {                    Thread thisThread = Thread.currentThread();                    leader = thisThread;                    try {                        available.awaitNanos(delay);                    } finally {                        if (leader == thisThread)                            leader = null;                    }                }            }        }    } finally {        if (leader == null && q.peek() != null)            available.signal();        lock.unlock();  }}

今天再剖析吧,先睡了,晚安全世界!