key.cancel()和iterator.remove()有什么区别? 从迭代器中删除密钥也不能从选择器中删除密钥吗?
假设:
...
SelectionKey key = (SelectionKey) iterator.next();
..
Iterator<SelectionKey> iterator = selectedKeys.iterator();
...
答案 0 :(得分:2)
SelectionKey的Javadoc跟随..
每次使用选择器注册频道时,都会创建一个选择键。密钥保持有效,直到通过调用其取消方法,关闭其通道或关闭其选择器来取消密钥。 取消密钥不会立即将其从选择器中删除;它将被添加到选择器的已取消键集中,以便在下一个选择操作期间删除。
iterator.remove,将其从列表中删除。
答案 1 :(得分:0)
当您在remove()
上呼叫Iterator
时,它只会从列表中删除Iterator当前所在的对象。它不会调用对象上的任何方法,它不会以任何方式影响它 - 它只是将它从列表中删除。
当您在cancel()
上调用SelectionKey
时,它碰巧会执行相同的操作,但这是因为cancel()
请求列表删除该对象。此外,它不能保证立即发生,而使用remove()
会立即从列表中删除该项目。 cancel()
只是让它无用,当它有机会时,将其从列表中删除。