DelayQueue出队基于延迟自动触发,take()阻塞等待到期元素,poll()非阻塞立即返回,poll(long,TimeUnit)带超时阻塞,peek()仅查看不判断到期。

DelayQueue 的出队操作是基于元素的延迟时间自动触发的,不是调用者主动“拉取”,而是当元素到期后才能被成功取出。它内部使用优先队列(PriorityQueue)+ 可重入锁(ReentrantLock)实现,**出队(poll / take)本质是等待并获取最早到期的元素**。
take():阻塞直到有元素到期
这是最常用的出队方式。如果队列为空,或队首元素还没到期,当前线程会一直阻塞,直到满足任一条件:
- 队首元素的
getDelay(TimeUnit.NANOSECONDS)返回值 ≤ 0(即已到期) - 有其他线程向队列中添加了更早到期的元素
一旦到期,take() 立即返回该元素,并从队列中移除。注意:它不会轮询,而是靠 Condition(`available`)唤醒,性能高效。
poll():非阻塞,立即返回结果
poll() 不会等待,它只做一次检查:
立即学习“Java免费学习笔记(深入)”;
- 如果队首元素已到期 → 返回该元素并移除
- 如果队首未到期,或队列为空 → 直接返回
null
适合对实时性要求高、不想卡住线程的场景,比如在定时任务调度器中做快速试探。
jQuery鼠标经过方形图片切换成圆边特效,点击图片会弹出浮层,适合团队页面的展示,兼容主流浏览器,php中文网推荐下载! 使用方法: 1、在head区域引入样式表文件lrtk.css 2、在head区域引入jquery-1.7.1.js 3、在你的网页中加入注释区域代码即可。
poll(long, TimeUnit):带超时的阻塞出队
类似 take(),但多了超时机制。线程最多等待指定时间:
- 期间有元素到期 → 立即返回该元素
- 超时仍未到期 → 返回
null
比 take() 更可控,避免无限等待,适合需要兜底逻辑的业务(如重试任务加最大等待时限)。
peek():只看不取,不触发延迟判断
peek() 返回队首元素(未移除),但不会检查是否到期。它可能返回一个尚未到期的元素 —— 这是 DelayQueue 的设计特性,因为底层优先队列只按延迟排序,不拦截未到期访问。
所以:不要用 peek() 判断“是否有可处理任务”,而应直接用 take() 或 poll()。
基本上就这些。DelayQueue 的出队核心就三点:到期才可取、take 阻塞等、poll 看一眼就走。用对方法,就能稳稳支撑延时任务、缓存过期、订单超时关单等场景。










