功能
- 延迟队列中的所有元素都有一个时间
倒计时的作用
,在调用 take 时会阻塞去获取数据,直到队列头的数据倒计时结束,才返回。
源码分析
- 父级
- BlockingQueue
所以延迟队列也是阻塞的
- 成员
- PriorityQueue q
该优先级队列用于保存元素,并且能够将元素按照倒计时排序,倒计时小的在队列前面
- Thread leader
Leader/Follower模式,减少线程的开销
- Leader/Flower 模式
- 先从优先级队列中取出时间最小的元素
- 如果时间已经为 0 了,那么可以直接返回给外部
- 否则
- 如果有 leader,自己又不是 leader 那就休眠等待,
leader的时间结束后返回给外部,然后会唤醒其他follower线程,这就明显的能够减少一些轮询开销了
- 如果没有 leader,那么将当前线程设置成 leader,然后计算出元素剩下的倒计时,并且按照计算出的时间休眠
- 关键代码如下
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();
}
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于