kafka 时间轮 tick 推进 为什么不用 delayQueue#take

2020-07-20 11:08:48 +08:00
 yanshenxian

图片方框中的代码使用的是 bucket = delayQueue.poll(timeoutMs, TimeUnit.MILLISECONDS);

如果第一个即将到期的任务 >> 轮询的 timeoutMs, 这样不是会造成大量 cpu 空转吗

为什么不能用 bucket = delayQueue.take();

1747 次点击
所在节点    Java
6 条回复
yanshenxian
2020-07-20 12:43:58 +08:00
mightofcode
2020-07-20 17:11:31 +08:00
take 不能指定超时
yanshenxian
2020-07-20 17:12:45 +08:00
@mightofcode 这个不需要指定超时啊 时间轮只需要把过期的 task 取出来就行
mightofcode
2020-07-20 17:30:12 +08:00
@yanshenxian 不指定超时的话不就一直阻塞在这里了吗,看情况应该是不想阻塞在这吧
yanshenxian
2020-07-20 17:43:20 +08:00
@mightofcode 嗯 我觉得这里一直阻塞到有任务过期也是没问题的,换成 poll 也是相当于循环阻塞知道有任务过期
hfc
2020-07-21 10:14:17 +08:00
没有 CPU 空转吧,这里的 timeoutMs 时间内线程是 TIMEOUT_WATING 状态,不会占用 CPU 。超时没有获取到任务就返回 false 了。
至于为什么用 take,大概就是需要一个超时能自动结束的接口,翻翻代码或许也能找到使用 take 的接口,但是两者使用场景不同。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/691496

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX