Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Java NIO选择器中使用iterator.remove()迭代SelectionKey_Java_Hbase_Nio - Fatal编程技术网

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

为什么在Java NIO选择器中使用iterator.remove()迭代SelectionKey,java,hbase,nio,Java,Hbase,Nio,下面的代码是从HBase RpcServer.java中截取的。我无法理解每次循环中都会删除SelectionKey。这里有什么原因吗?这是优化吗 try { selector.select(); Iterator<SelectionKey> it = selector.selectedKeys().iterator(); while (it.hasNext()) { SelectionKey key = it.ne

下面的代码是从HBase RpcServer.java中截取的。我无法理解每次循环中都会删除SelectionKey。这里有什么原因吗?这是优化吗

      try {
      selector.select();

      Iterator<SelectionKey> it = selector.selectedKeys().iterator();

      while (it.hasNext()) {
        SelectionKey key = it.next();
        it.remove();
        if (key.isValid()) {
          if (key.isReadable()) {
            doRead(key);
          }
        }
      }

    } catch (IOException e) {
      LOG.warn("Run into IOExpection in " + name, e);
    }
试试看{
selector.select();
迭代器it=selector.selectedKeys().Iterator();
while(it.hasNext()){
SelectionKey=it.next();
it.remove();
if(key.isValid()){
if(key.isReadable()){
多雷德(钥匙);
}
}
}
}捕获(IOE异常){
LOG.warn(“在“+name,e”中遇到IOExpection);
}

所选按键的结果包含当前可用于其所选操作的频道按键(例如
读取
写入
)。如果不删除密钥,它将保留在集合中,下一次调用
select()
(和系列)仍将包含它,即使关联的通道尚未准备好进行所选操作

根据以下文件:

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

  • 密钥集包含表示此选择器当前频道注册的密钥。此集合由keys方法返回
  • 所选密钥集是密钥集,使得在先前的选择操作期间,检测到每个密钥的信道为在密钥的兴趣集中识别的至少一个操作做好准备。此集合由方法返回。选定的关键点集始终是关键点集的子集
[……]

通过选择操作将关键点添加到选定关键点集。键可以通过调用所选键集的remove方法或调用从该集获得的迭代器的remove方法直接从所选键集中移除。键不会以任何其他方式从所选键集中移除;特别是,它们不会因选择操作的副作用而被删除。不能将关键点直接添加到选定的关键点集


(emphasis mine)

所选按键的结果包含当前可用于其所选操作的频道按键(例如
读取
写入
)。如果不删除密钥,它将保留在集合中,下一次调用
select()
(和系列)仍将包含它,即使关联的通道尚未准备好进行所选操作

根据以下文件:

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

  • 密钥集包含表示此选择器当前频道注册的密钥。此集合由keys方法返回
  • 所选密钥集是密钥集,使得在先前的选择操作期间,检测到每个密钥的信道为在密钥的兴趣集中识别的至少一个操作做好准备。此集合由方法返回。选定的关键点集始终是关键点集的子集
[……]

通过选择操作将关键点添加到选定关键点集。键可以通过调用所选键集的remove方法或调用从该集获得的迭代器的remove方法直接从所选键集中移除。键不会以任何其他方式从所选键集中移除;特别是,它们不会因选择操作的副作用而被删除。不能将关键点直接添加到选定的关键点集


(强调我的)

我不知道hbase,但因为有
selector.select()在顶部,我想这是为了在某种程度上重置选择,即删除正在处理的元素。@Thomas
selector
是Java NIO API的一部分,与HBase本身无关。我不知道HBase,但因为存在
selector.select()在顶部,我想这是为了在某种程度上重置选择,即删除正在处理的元素。@Thomas
选择器是Java NIO API的一部分,与HBase本身无关。