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

Java 如果在select()之前调用wakeup(),则Selector.select()不会填充selectedKeys(),java,nio,wakeup,Java,Nio,Wakeup,我有一个有点复杂的循环来处理几个不同的NIO通道和其他对象。其中一些对象通过调用触发其处理(即模拟“选择”-事件) 当我在每次调用之前总是调用wakeup(),从而意外地将线程放入忙循环时,我注意到我的其他NIO通道根本无法得到服务。一旦触发繁忙环路的条件消失,所有其他通道立即恢复正常服务 经过一番周折后,我发现我的其他频道不再提供服务的原因是select()没有填满列表,如果它由于挂起的唤醒()而立即返回 这是预期的行为吗?我在文档中找不到有关此详细信息的任何信息。 如果是这样的话,有没有一种

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

当我在每次调用之前总是调用wakeup(),从而意外地将线程放入忙循环时,我注意到我的其他NIO通道根本无法得到服务。一旦触发繁忙环路的条件消失,所有其他通道立即恢复正常服务

经过一番周折后,我发现我的其他频道不再提供服务的原因是select()没有填满列表,如果它由于挂起的唤醒()而立即返回

这是预期的行为吗?我在文档中找不到有关此详细信息的任何信息。

如果是这样的话,有没有一种方法可以更优雅地防止这种情况,而不是在每个select()后面加上一个额外的。由于唤醒,它立即重新调谐,因此它不会阻止查找准备好的频道、填充选定的键等。

这是否有文档记录?我假设你醒来了;选择();将相当于selectNow();我假设wakeup()正确吗;选择现在();然后也不填充选定的关键点?