彻底搞懂了!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再次放进已选择键集的,到那时候,可以再次处理它。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值