DelayQueue 基本原理深入分析

DelayQueue是一个无界阻塞队列,使用ReentrantLock和Condition进行阻塞与通知。队列内部使用PriorityQueue按延迟时间排序,确保最先到期的元素优先出队。在获取元素时,若未到期则线程会被阻塞等待,通过线程元素leader优化避免多余的等待。加入元素时,若新元素提前到期,会唤醒等待线程。
摘要由CSDN通过智能技术生成

DelayQueue是一个无界阻塞队列,队列中元素只有在延迟期满时才能从中提取。在每次往优先级队列中添加元素时以元素的过期时间作为排序条件,最先过期的元素放在优先级最高。

DelayQueue实现的关键主要有如下几个:

  1. 可重入锁ReentrantLock
  2. 用于阻塞和通知的Condition对象
  3. 根据Delay时间排序的优先级队列:PriorityQueue(完全二叉堆)
  4. 用于优化阻塞通知的线程元素leader

DelayQueue的实现原理,个人理解如下概括:

操作一:获取最先过期元素

由于使用PriorityQueue数据结构,在添加元素时,最先过期的元素将一直放在优先级最高,即PriorityQueue的队头(详细请了解二叉堆数据结构),所以获取最先过期元素,即获取PriorityQueue的队头元素。

通过可重入锁ReentrantLock,筛选出一个获取元素的线程(假设线程A),如果此时元素已经过期则直接取得。

如果元素还未过期,还需要delay时间才到期,将线程A阻塞等待delay时间(通过条件对象Condition阻塞线程),时间到后则可以能够获取对头元素。

这里有个问题,由于线程A阻塞等待,所以锁将被释放,其他线程此时可以获取队头数据,也就是说,在线程A阻塞等待delay时间里,其他线程会不断的获取队头数据。如果它们也阻塞等待delay时间则有些多余,因为线程A已经在等待了对于这种情况就是通过线程元素leader优化阻塞通知的线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值