我发现了一些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()
即使它尚未准备好使用,我们也会一次又一次地获得密钥。
我们有一个简单的需求,其中:ps:https://==https:/// 问题是: 当用户键入-https://company_landing.company.com时 Keycloak试图打开登陆页面,但给出了500个内部服务器错误,并表示“不正确的重定向URI”,在浏览器中我看到了以下内容: https://ourcompany-keycloak.company.com/auth/realms
我正在编写C++来解决这个问题,从leetcode:https://leetcode.com/problems/remove-element/ 给定数组nums和值val,移除该值的所有实例并返回新的长度。 不要为另一个数组分配额外的空间,您必须用O(1)个额外内存修改输入数组。 元素的顺序可以更改。你在新长度之外留下什么并不重要。 您的函数应该返回长度=2,nums的前两个元素为2。 在返回长度
我正在编写一个函数,该函数应该删除链表的最后一个元素 这是我对节点的定义 我有一个节点列表1,它为值1、2、3运行了3次insert函数 insert函数如下所示 现在我的delete_last_element函数如下所示 基本上,我的想法是,我会先看看第一个元素是否为空,如果是,我什么也不做,因为没有最后一个元素。然后我将curr设置为head->next以查看列表中的下一个元素,如果它为nul
为什么已经从PHP中删除了,还有其他原因吗?
问题内容: 我拼命地试图从字符串中删除空格(后来我希望能够将其转换为一个int),但是我似乎无法正常运行。 你能告诉我,我做错了什么吗?PS:我也尝试过\ W“和\ S” 问题答案: 更换 与 它将起作用,因为字符串是不可变的,因此不会更改您的字符串对象,它将返回一个新的字符串对象。因此,您将变量分配给由返回的字符串 另外,您应该尝试遵循Java命名约定,并使字段和变量以小写字母开头。 而且,您也
问题内容: 阅读针对iOS 9的这篇文章后,我知道您不再需要removeObserver。 然而,对于iOS 8的,你需要给 removeObserver 在中的viewController的方法。但我无法理解。如果一个viewController被释放,那么它的DEAD不是吗?为什么我们需要做一个removeObserver。作为观察员就像打电话给永远不会接电话的死者一样 我不明白什么? 问题答