为什么在Java NIO Selector中使用iterator.remove()迭代SelectionKey

时间:2016-03-16 16:08:28

标签: java hbase nio

以下代码从HBase RpcServer.java中删除。我无法理解在每次循环时删除SelectionKey。这里有一些原因吗?它是优化吗?

bundle config build.libv8 --with-system-v8

1 个答案:

答案 0 :(得分:2)

selectedKeys的结果包含当前可用于所选操作的频道的键(例如READWRITE)。如果您没有删除该密钥,它将保留在该集合中,即使关联的频道尚未为所选操作做好准备,下一次调用select()(和系列)仍会包含该密钥。

来自Selector的文档:

  

可选择频道的选择器注册由SelectionKey对象表示。选择器维护三组选择键:

     
      
  • 键集包含表示此选择器的当前频道注册的键。该方法由keys方法返回。
  •   
  • 选择键集是一组键,以便检测到每个键的通道已准备好进行至少一项在键的兴趣中识别的操作在先前的选择操作期间设置。该集由selectedKeys方法返回。选定键集始终是键集的子集。
  •   
     

[..]

     

通过选择操作将 添加到所选键集。通过调用set的remove方法或通过调用从集合中获取的迭代器的remove方法,可以直接从selected-key集中删除。从任意其他方式 永远不会删除;特别是,它们不会作为选择操作的副作用而被删除。密钥可能无法直接添加到选定密钥集。

(强调我的)