V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yanshenxian
V2EX  ›  Java

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

  •  
  •   yanshenxian · 2020-07-20 11:08:48 +08:00 · 1819 次点击
    这是一个创建于 1623 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    27C51040-C4DB-4965-92A5-C0667F2BCEF3.jpeg

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

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

    6 条回复    2020-07-21 10:14:17 +08:00
    mightofcode
        2
    mightofcode  
       2020-07-20 17:11:31 +08:00
    take 不能指定超时
    yanshenxian
        3
    yanshenxian  
    OP
       2020-07-20 17:12:45 +08:00
    @mightofcode 这个不需要指定超时啊 时间轮只需要把过期的 task 取出来就行
    mightofcode
        4
    mightofcode  
       2020-07-20 17:30:12 +08:00
    @yanshenxian 不指定超时的话不就一直阻塞在这里了吗,看情况应该是不想阻塞在这吧
    yanshenxian
        5
    yanshenxian  
    OP
       2020-07-20 17:43:20 +08:00
    @mightofcode 嗯 我觉得这里一直阻塞到有任务过期也是没问题的,换成 poll 也是相当于循环阻塞知道有任务过期
    hfc
        6
    hfc  
       2020-07-21 10:14:17 +08:00
    没有 CPU 空转吧,这里的 timeoutMs 时间内线程是 TIMEOUT_WATING 状态,不会占用 CPU 。超时没有获取到任务就返回 false 了。
    至于为什么用 take,大概就是需要一个超时能自动结束的接口,翻翻代码或许也能找到使用 take 的接口,但是两者使用场景不同。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2565 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:51 · PVG 11:51 · LAX 19:51 · JFK 22:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.