美文网首页Java学习笔记
Selector键集遍历后必须手动remove的介绍

Selector键集遍历后必须手动remove的介绍

作者: 徐士林 | 来源:发表于2017-02-18 22:54 被阅读242次

    抱歉,,实在是不知道这篇文章该有个上面主题,就这样随便写一个名字吧

    在java nio中selector函数会一直阻塞到至少有一个通道在你注册事件上就绪。但是这个方法还有一个非常重要的一点。select()返回的是上一次到本次选择,所增加的数目。
    也就是说上一次选择过后,Set中已经存在了某一个Selectionkey没有remove掉,那么下次selector.select(),选择中不会包含这个键,但是集合中仍然有这个事件会被处理。

    Set..iterator().remove()的作用,从选择键集中删除该建

    与其相反selector.selectedKeys()中表示的选择键集,该建集如果不remove掉会一直存在。

    但是如果已经从channel中把数据已经读出来了。则下次读取不会包含该数据,意思是这个键仍然是可读的,但是读不出来数据。
    但是如果通道注册的是write事件,这个可就要小心点了。

    一般来说,你不应该注册写事件。写操作的就绪条件为底层缓冲区有空闲空间,而写缓冲区绝大部分时间都是有空闲空间的,所以当你注册写事件后,写操作一直是就绪的,选择处理线程全占用整个CPU资源。所以,只有当你确实有数据要写时再注册写操作,并在写完以后马上取消注册。

    相关文章

      网友评论

        本文标题:Selector键集遍历后必须手动remove的介绍

        本文链接:https://www.haomeiwen.com/subject/hhedwttx.html