如果在select()之前调用wakeup(),则Selector.select()不会填充selectedKeys()

时间:2017-02-01 22:07:59

标签: java nio wakeup

我有一个复杂的循环处理几个不同的NIO通道和其他对象。其中一些对象通过调用 Selectorwakeup() 来触发其处理(即模拟“选择” - 事件)。

当我在每次调用 select() <之前总是调用 wakeup() 时,我意外地将我的线程置于忙碌循环中/ em> ,我注意到我的其他NIO频道根本不再获得服务。一旦触发忙碌循环的条件消失,所有其他通道就会像往常一样立即再次进行维修。

经过一番讨论之后,我发现我的其他频道不再被提供服务的原因是 select() 没有填写清单如果由于待处理 唤醒() 而立即返回,则 selectedKeys()

这是预期的行为吗?关于这个细节,我在文档中找不到任何内容 如果是这样,有没有办法比使用其他 selectNow() 更优雅地阻止这种情况>

1 个答案:

答案 0 :(得分:0)

当然是预料之中的。由于唤醒,它立即重新调整,所以它没有阻止寻找准备好的频道,填充选定的键等。