图片方框中的代码使用的是 bucket = delayQueue.poll(timeoutMs, TimeUnit.MILLISECONDS);
如果第一个即将到期的任务 >> 轮询的 timeoutMs
, 这样不是会造成大量 cpu 空转吗
为什么不能用 bucket = delayQueue.take();
呢
1
yanshenxian OP |
2
mightofcode 2020-07-20 17:11:31 +08:00
take 不能指定超时
|
3
yanshenxian OP @mightofcode 这个不需要指定超时啊 时间轮只需要把过期的 task 取出来就行
|
4
mightofcode 2020-07-20 17:30:12 +08:00
@yanshenxian 不指定超时的话不就一直阻塞在这里了吗,看情况应该是不想阻塞在这吧
|
5
yanshenxian OP @mightofcode 嗯 我觉得这里一直阻塞到有任务过期也是没问题的,换成 poll 也是相当于循环阻塞知道有任务过期
|
6
hfc 2020-07-21 10:14:17 +08:00
没有 CPU 空转吧,这里的 timeoutMs 时间内线程是 TIMEOUT_WATING 状态,不会占用 CPU 。超时没有获取到任务就返回 false 了。
至于为什么用 take,大概就是需要一个超时能自动结束的接口,翻翻代码或许也能找到使用 take 的接口,但是两者使用场景不同。 |