SeletionKey.cancel()和iterator.remove()的区别 - java

时间:2015-01-14 16:53:43

标签: java

key.cancel()和iterator.remove()有什么区别? 从迭代器中删除密钥也不能从选择器中删除密钥吗?

假设:

...
SelectionKey key = (SelectionKey) iterator.next();
..
Iterator<SelectionKey> iterator  = selectedKeys.iterator();
...

2 个答案:

答案 0 :(得分:2)

SelectionKey的Javadoc跟随..

每次使用选择器注册频道时,都会创建一个选择键。密钥保持有效,直到通过调用其取消方法,关闭其通道或关闭其选择器来取消密钥。 取消密钥不会立即将其从选择器中删除;它将被添加到选择器的已取消键集中,以便在下一个选择操作期间删除。

iterator.remove,将其从列表中删除。

答案 1 :(得分:0)

当您在remove()上呼叫Iterator时,它只会从列表中删除Iterator当前所在的对象。它不会调用对象上的任何方法,它不会以任何方式影响它 - 它只是将它从列表中删除。

当您在cancel()上调用SelectionKey时,它碰巧会执行相同的操作,但这是因为cancel()请求列表删除该对象。此外,它不能保证立即发生,而使用remove()会立即从列表中删除该项目。 cancel()只是让它无用,当它有机会时,将其从列表中删除。