首页
学习
活动
专区
工具
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

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-08-21 04:10:54

因为Selector从不这样做,它只会添加到set中,所以如果您不这样做,那么下次Selector返回时,您将自己重新处理该事件。

票数 13
EN

Stack Overflow用户

发布于 2011-08-20 21:46:18

因为在这样做之前,您无法检测到新的事件重复。

票数 0
EN

Stack Overflow用户

发布于 2013-09-01 03:30:47

因为从选定的集合中删除关键点,当它被处理时,它将等待下一个选择事件。

选定集包含就绪通道的关键点。

 selector.select(); //This may block for a long time. Upon returning, the elected set contains keys of the ready channels.

在选定的键集上获取迭代器,并执行Business Information

Iterator it = selector.selectedKeys().iterator(  );

最后从选定的集合中删除关键点;它已被处理

 it.remove(  );

可以直接从该集合中删除密钥,但不能添加密钥。尝试添加到选定的关键点集会引发java.lang.UnsupportedOperationException。

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

https://stackoverflow.com/questions/7132057

复制
相关文章

相似问题

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