我找到了一些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()
一次又一次地获取密钥,即使它还没有准备好使用。
https://stackoverflow.com/questions/7132057
复制相似问题