只是想知道当密钥集为0时,Java中Selector
的正常行为是什么,因为它本质上是一个无意义的操作(没有可供选择的密钥)。即使密钥设置为0,也可能无论如何都会发生操作。但是,是否可以在选择期间注册通道密钥并在选择期间重新评估操作?
如果不是这种情况,那么没有键的选择操作肯定会花费无限的时间吗?在这种情况下,其他网络代码会发生什么? :)也许这只是一个确保密钥集永远不会为0的情况。但我想知道,因为我已经编写了一个选择器,需要确保它符合官方行为。
答案 0 :(得分:1)
Selector
类是抽象的,实际操作取决于Selector
实际返回的SelectorProvider
实现类型。这取决于操作系统。
如果实现使用Sun的sun.nio.ch.SelectorImpl
作为基类(它也是抽象的),那么可以观察到select()
方法在调用抽象{{1}之前在公钥上同步} 方法。 doSelect()
方法也在公钥上同步,因此寄存器肯定可能必须等待选择,而选择将永远不会完成,因为没有注册。
不幸的是,这是所有抽象类,所以我们无法确定。我确实观察到register()
文档描述了如何解开卡在Selector
中的线程,因此可能会出现经常值得记录的内容,因此您可以担心。