为什么在Java NIO选择器中使用iterator.remove()迭代SelectionKey
下面的代码是从HBase RpcServer.java中截取的。我无法理解每次循环中都会删除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
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方法返回
- 所选密钥集是密钥集,使得在先前的选择操作期间,检测到每个密钥的信道为在密钥的兴趣集中识别的至少一个操作做好准备。此集合由方法返回。选定的关键点集始终是关键点集的子集
(emphasis mine)所选按键的结果包含当前可用于其所选操作的频道按键(例如
读取
,写入
)。如果不删除密钥,它将保留在集合中,下一次调用select()
(和系列)仍将包含它,即使关联的通道尚未准备好进行所选操作
根据以下文件:
可选频道与选择器的注册由SelectionKey
对象表示。选择器维护三组选择键:
- 密钥集包含表示此选择器当前频道注册的密钥。此集合由keys方法返回
- 所选密钥集是密钥集,使得在先前的选择操作期间,检测到每个密钥的信道为在密钥的兴趣集中识别的至少一个操作做好准备。此集合由方法返回。选定的关键点集始终是关键点集的子集
(强调我的)我不知道hbase,但因为有
selector.select()代码>在顶部,我想这是为了在某种程度上重置选择,即删除正在处理的元素。@Thomasselector
是Java NIO API的一部分,与HBase本身无关。我不知道HBase,但因为存在selector.select()代码>在顶部,我想这是为了在某种程度上重置选择,即删除正在处理的元素。@Thomas选择器是Java NIO API的一部分,与HBase本身无关。