一个无界的延迟队列,仅仅当队列内有元素到期时才能被取出。
元素必须实现Delayed接口,用于判定元素是否到期。
public interface Delayed extends Comparable<Delayed> {
/**
* Returns the remaining delay associated with this object, in the
* given time unit.
*
* @param unit the time unit
* @return the remaining delay; zero or negative values indicate
* that the delay has already elapsed
*/
long getDelay(TimeUnit unit);
}
该队列的实现十分巧妙,内部维护一个优先队列,排序的规则是过期时间。这样队首元素一定是最快过期的元素,如果head没有过期,那么队列内肯定没有其他过期的元素了。
代码
可以先看不带超时的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();
}
}
如果head不为空,就看head是否过期,如果没有过期,怎直接调用内部的queue的poll方法,否则没有元素过期,直接返回null。
未完待续。。。