【问题标题】:What is the default behaviour of a selector when the key set is sized 0?当键集大小为 0 时,选择器的默认行为是什么?
【发布时间】:2011-08-04 11:51:01
【问题描述】:

只是想知道当键集为 0 时,Java 中 Selector 的正常行为是什么,因为它本质上是无意义的操作(没有可供选择的键)。可能无论如何都会发生操作,即使键集为 0。但是,是否可以在选择期间注册通道键并在选择期间重新评估操作?

如果不是这种情况,那么没有键的选择操作肯定会花费无限的时间吗?在这种情况下,其他网络代码会发生什么? :) 也许这只是确保密钥集永远不会为 0 的情况。但我想知道,因为我已经编写了一个选择器并且需要确保它与官方行为匹配。

【问题讨论】:

    标签: java css-selectors nio


    【解决方案1】:

    Selector 类是抽象的,实际操作取决于SelectorProvider 实际返回的Selector 实现类型。这些取决于操作系统。

    如果实现使用 Sun 的 sun.nio.ch.SelectorImpl 作为基类(它也是抽象的),那么可以观察到 select() 方法在调用抽象 doSelect() 方法之前在公钥上同步。 register() 方法也在公钥上同步,因此注册器肯定有可能必须等待选择并且选择永远不会完成,因为没有注册任何内容。

    不幸的是,它都是抽象类,所以我们不能确定。我确实注意到Selector 文档描述了如何解开卡在select() 中的线程,所以大概它经常出现,值得记录,因此您有理由担心。

    【讨论】:

    • 我认为我修复了导致问题的潜在问题,该问题似乎是由与此问题相关的某些东西引起的。原来我已经搞砸了 SelectorImpl 和我自己的 Selector 选择方法(我自己的副本),它们需要将 0 转换为 -1,其中 -1 表示无限等待。我把事情过度简化了,不小心把它拿出来了。此外, select 方法没有使用 -1 作为无限等待,所以我不得不改变它。 0 被解释为进行初始选择并返回。所以这似乎现在可以正常工作了。
    • 不,它不依赖于实现。它在 Javadoc 中指定,实现必须遵守。如果没有键,就没有准备好的东西,所以它必须永远阻塞,或者直到超时,这取决于你调用的方法。
    猜你喜欢
    • 1970-01-01
    • 2012-11-08
    • 2018-11-23
    • 2014-04-30
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    相关资源
    最近更新 更多