只是想知道 Selector
的正常行为是什么在Java中是当键集为0时,因为它本质上是一个毫无意义的操作(没有可供选择的键)。即使键集设置为 0,操作也可能无论如何都会发生。但是,是否可以在选择期间注册 channel 键并在选择期间重新评估操作?
如果不是这种情况,那么没有键的选择操作肯定会花费无限长的时间吗?在这种情况下,其他网络代码会发生什么? :) 也许这只是确保键集永远不为 0 的情况。但我想知道,因为我已经编写了一个选择器并且需要确保它与官方行为匹配。
最佳答案
Selector
类是抽象的,实际操作取决于 SelectorProvider
实际返回的 Selector
实现类型。这些取决于操作系统。
如果实现使用 Sun 的 sun.nio.ch.SelectorImpl
作为基类(它也是抽象的),那么可以观察到 select()
方法在调用抽象 doSelect()
方法之前在公钥上进行同步。 register()
方法还同步公钥,因此注册器很可能必须等待选择,而选择将永远不会完成,因为没有注册任何内容。
不幸的是,它都是抽象类,所以我们不能确定。我确实观察到,Selector
文档描述了如何解除卡在 select()
中的线程,因此大概它经常出现,值得记录,因此您的担心是正确的。
关于java - 当键集大小为 0 时,选择器的默认行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5645932/