我是靠谱客的博主 纯真河马,这篇文章主要介绍java selected_为什么要在java nio的`selector.selectedKeys()。iterator()`中删除键?...,现在分享给大家,希望可以做个参考。

我发现了一些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 提供的答案,我想我现在已经明白了,让我详细解释一下。

选择器中有2个表:

登记表:当我们呼叫时channel.register,其中会有一个新的项目(密钥)。仅当我们调用时key.cancel(),它将从此表中删除。

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

这就是为什么iter.remove()当我们从选择表中获得键时必须调用的原因。如果没有,selector.selectedKeys()即使它尚未准备好使用,我们也会一次又一次地获得密钥。

最后

以上就是纯真河马最近收集整理的关于java selected_为什么要在java nio的`selector.selectedKeys()。iterator()`中删除键?...的全部内容,更多相关java内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部