抱歉,,实在是不知道这篇文章该有个上面主题,就这样随便写一个名字吧
在java nio中selector函数会一直阻塞到至少有一个通道在你注册事件上就绪。但是这个方法还有一个非常重要的一点。select()返回的是上一次到本次选择,所增加的数目。
也就是说上一次选择过后,Set中已经存在了某一个Selectionkey没有remove掉,那么下次selector.select(),选择中不会包含这个键,但是集合中仍然有这个事件会被处理。
Set..iterator().remove()的作用,从选择键集中删除该建
与其相反selector.selectedKeys()中表示的选择键集,该建集如果不remove掉会一直存在。
但是如果已经从channel中把数据已经读出来了。则下次读取不会包含该数据,意思是这个键仍然是可读的,但是读不出来数据。
但是如果通道注册的是write事件,这个可就要小心点了。
一般来说,你不应该注册写事件。写操作的就绪条件为底层缓冲区有空闲空间,而写缓冲区绝大部分时间都是有空闲空间的,所以当你注册写事件后,写操作一直是就绪的,选择处理线程全占用整个CPU资源。所以,只有当你确实有数据要写时再注册写操作,并在写完以后马上取消注册。