
本教程操作环境:windows7系统、java10版,DELL G3电脑。
1.DelayQueue类
1 2 | public class DelayQueue<E extends Delayed> extends AbstractQueue<E>
implements BlockingQueue<E>
|
DelayQueue 继承AbstractQueue抽象类,实现BlockingQueue接口,元素必须实现实现Delayed接口。
2.take()出队流程
(1)加锁;
(2)判断堆顶元素是否为空,为空的话直接阻塞等待;
(3)判断堆顶元素是否到期,到期了直接poll()出元素;
(4)没到期,再判断前面是否有其它线程在等待,有则直接等待;
(5)前面没有其它线程在等待,则把自己当作第一个线程等待delay时间后唤醒,再尝试获取元素;
(6)获取到元素之后再唤醒下一个等待的线程;
(7)解锁;
3.take出队实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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 ;
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();
}
}
|
以上就是DelayQueue在java的出队方法,相信大家已经对于阻碍队列中元素的操作得心应手。同时不要忘记在针对不同队列时,一些使用事项的注意点。