DelayQueue是一个基于优先队列实现的无界阻塞队列,它不允许值为null。只有当DelayQueue中的元素已经过期时,这个元素才能被删除。
继承结构
1 | public class DelayQueue<E extends Delayed> extends AbstractQueue<E> |
DelayQueue中的元素必须实现Delayed接口,该接口中只有一个方法:
1 | // 如果返回值<=0,表示该对象已经过期 |
存储结构
1 | private final PriorityQueue<E> q = new PriorityQueue<E>(); |
关于排序顺序,在DelayQueue的注释中有如下描述:
The head of the queue is that {@code Delayed} element whose delay expired furthest in the past.
这句话不太好直译,大概意思是:队首元素是距离过期时间最短的元素。
锁与条件
1 | private final transient ReentrantLock lock = new ReentrantLock(); |
Leader与Follower
1 | private Thread leader = null; |
leader表示一个等待删除队首元素的线程。如果leader不为空,则表示已经有线程在等待删除队首元素。此时,如果当前线程也想删除队首元素,则必须等待leader执行完出队操作。
入队操作
由于DelayQueue是无界的,因此,入队操作不会被阻塞。
1 | public void put(E e) { |
出队操作
take方法
如果队首元素没有到达规定的延时时间(过期),那么让当前线程处于等待状态,即阻塞当前线程。
1 | // 一直等到队首元素过期,并被删除为止 |
poll方法
1 | public E poll() { |