彻底搞懂了!Java Nio 之 selector ---为什么删除已选择键

学习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再次放进已选择键集的,到那时候,可以再次处理它。

展开阅读全文

没有更多推荐了,返回首页