首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么要在java nio的`selector.selectedKeys().iterator()`中删除密钥?

为什么要在java nio的`selector.selectedKeys().iterator()`中删除密钥?
EN

Stack Overflow用户
提问于 2011-08-20 21:33:30
回答 5查看 7.9K关注 0票数 22

我找到了一些java nio的示例代码:

 ServerSocketChannel server = ServerSocketChannel.open();  
 Selector selector = Selector.open();  
 server.socket().bind(new InetSocketAddress(8080));  
 server.configureBlocking(false); 
 server.register(selector, SelectionKey.OP_ACCEPT);  

 while(true) {
     selector.select(); 
     Iterator iter = selector.selectedKeys().iterator();  
     while (iter.hasNext()) {  
         SelectionKey key = (SelectionKey) iter.next();  
         iter.remove();  // Why remove it? 
         process(key);  
     }
 }

当他获得选定的关键点时,他删除循环中的关键点。为什么我们要这样做?

更新

感谢EJPuser270349提供的答案,我想我现在明白了,让我详细解释一下。

选择器中有两个表:

  1. 注册表:当我们调用channel.register时,将有一个新的项(键)进入其中。
  2. 准备好选择表:当我们调用selector.select()时,选择器将查找注册表,找到可用的键,将它们的引用复制到这个选择表中。选择器不会清除此表中的项(这意味着,即使我们再次调用selector.select(),它也不会清除现有项)

这就是为什么当我们从选择表中获得关键字时,我们必须调用iter.remove()。如果没有,我们将通过selector.selectedKeys()一次又一次地获取密钥,即使它还没有准备好使用。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7132057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档