学习Nio ,看到遍历处理 selector.selectedKeys() 方法的集合时,处理完一个要用迭代器删除这个已选择键。
Set selectedKeys = selector.selectedKeys();
Iterator keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
if(key.isAcceptable()) {
// a connection was accepted by a ServerSocketChannel.
} else if (key.isConnectable()) {
// a connection was established with a remote server.
} else if (key.isReadable()) {
// a channel is ready for reading
} else if (key.isWritable()) {
// a channel is ready for writing
}
keyIterator.remove();
}
为什么???那删了就不是不能用了吗?
我想了一个周末,看了无数资料,终于在众多资料中摸出了头绪:
周知,select ()方法是阻塞的,
当它被释放的时候,只有一个通道新就绪了。也就是增加了一个新就绪的通道。
但是 selector.selectedKeys() 返回的已选择键集,包含了当前所有准备就绪的通道。
我们理想中的处理思路是:
新增了一个就绪的通道,我就把这个通道的就绪事件(ready集合的操作)处理完,等下次新增的通道轮到是他的时候再处理它,没有轮到他的时候,就别来添乱了。
也就是新就绪的就处理,已经就绪几轮了的就不处理。
那程序怎么处理?就是遍历到一个已就绪的通道,处理,然后删掉。
这样,就可以每次只处理增量的通道了,存量的通道就先从已选择键集里删掉,等下次他又有事件就绪,触发让他成为增量的时候,他会被选择器selector再次放进已选择键集的,到那时候,可以再次处理它。