我找到了一些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);
}
}
当他获得选定的关键点时,他删除循环中的关键点。为什么我们要这样做?
更新
感谢EJP和user270349提供的答案,我想我现在明白了,让我详细解释一下。
选择器中有两个表:
channel.register
时,将有一个新的项(键)进入其中。selector.select()
时,选择器将查找注册表,找到可用的键,将它们的引用复制到这个选择表中。选择器不会清除此表中的项(这意味着,即使我们再次调用selector.select()
,它也不会清除现有项)这就是为什么当我们从选择表中获得关键字时,我们必须调用iter.remove()
。如果没有,我们将通过selector.selectedKeys()
一次又一次地获取密钥,即使它还没有准备好使用。
发布于 2011-08-21 04:10:54
因为Selector从不这样做,它只会添加到set中,所以如果您不这样做,那么下次Selector返回时,您将自己重新处理该事件。
发布于 2011-08-20 21:46:18
因为在这样做之前,您无法检测到新的事件重复。
发布于 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。
https://stackoverflow.com/questions/7132057
复制相似问题