当前位置: 首页 > news >正文

Netty源码分析(六):SelectedSelectionKeySetSelector

NioEventLoop中,NettySelector做了优化,当使用者没有禁用优化,并且优化进行顺利,会使用SelectedSelectionKeySetSelector来代替原来的Selector

SelectedSelectionKeySetSelector

SelectedSelectionKeySetSelector内部包含了两个对象,一个是Netty自定义的SelectedSelectionKeySet,另一个是原来的Selector。下面具体看下SelectedSelectionKeySet

SelectedSelectionKeySet

final class SelectedSelectionKeySet extends AbstractSet<SelectionKey> {
    /**
     * SelectionKey 数组
     */
    SelectionKey[] keys;
    /**
     * 数组可读大小
     */
    int size;

    SelectedSelectionKeySet() {
        keys = new SelectionKey[1024];
    }

    @Override
    public boolean add(SelectionKey o) {
        if (o == null) {
            return false;
        }
        keys[size++] = o;
        // 当数组占满时,进行扩容
        if (size == keys.length) {
            increaseCapacity();
        }
        return true;
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public boolean remove(Object o) {
        return false;
    }

    @Override
    public boolean contains(Object o) {
        return false;
    }

    @Override
    public Iterator<SelectionKey> iterator() {
        throw new UnsupportedOperationException();
    }

    void reset() {
        reset(0);
    }

    void reset(int start) {
        // 将key数组从start位到size位全置为null
        Arrays.fill(keys, start, size, null);
        size = 0;
    }

    /**
     * 将数组大小变为原来的2倍
     */
    private void increaseCapacity() {
        SelectionKey[] newKeys = new SelectionKey[keys.length << 1];
        System.arraycopy(keys, 0, newKeys, 0, size);
        keys = newKeys;
    }
}
复制代码

SelectedSelectionKeySet内部很简单,使用数组代替原Selector的中的HashSet,提高性能。数组默认大小为1024,不够用时容量*2。

NioEventLoop的processSelectedKeys方法,会根据有没有开启优化来选择不同的遍历方式,优化过的Selector由于使用的是数组,效率更高。

文中帖的代码注释全在:KAMIJYOUDOUMA, 有兴趣的童鞋可以关注一下。


本篇到此结束,如果读完觉得有收获的话,欢迎点赞、关注、加公众号【贰级天災】,查阅更多精彩历史!!!

相关文章:

  • 003-Java技术体系
  • vue的事件对象,方法执行
  • CAD图纸转换成高质量的彩色PDF格式如何操作?
  • 光伏工商业屋顶 Lora 组网监控方案
  • 莫等闲,白了少年头,空悲切!
  • 2017-11-28 在线编程网站对中文代码的支持
  • python 构造一个可以返回多个值的函数
  • 【多图警告】学会JavaScript测试你就是同行中最亮的仔(妹)
  • dict、defaultdict 和 OrderedDict 比较
  • SpringMVC初写(四)上传和下载功能的实现
  • 19-04-25
  • CentOS7下使用NFS文件共享给Window server 2012
  • 从技术人视角看闪电网络之微支付通道
  • java基础 数据类型转换
  • 即将到来的 Debian 10 Buster 发布版的新特点
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • dva中组件的懒加载
  • Flex布局到底解决了什么问题
  • HTTP那些事
  • IndexedDB
  • javascript面向对象之创建对象
  • Java比较器对数组,集合排序
  • Java多线程(4):使用线程池执行定时任务
  • mockjs让前端开发独立于后端
  • python docx文档转html页面
  • v-if和v-for连用出现的问题
  • 从setTimeout-setInterval看JS线程
  • 开源SQL-on-Hadoop系统一览
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 前端性能优化--懒加载和预加载
  • 世界上最简单的无等待算法(getAndIncrement)
  • 提醒我喝水chrome插件开发指南
  • 我这样减少了26.5M Java内存!
  • 与 ConTeXt MkIV 官方文档的接驳
  • 自定义函数
  • 我们雇佣了一只大猴子...
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (C#)获取字符编码的类
  • (windows2012共享文件夹和防火墙设置
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (六)Hibernate的二级缓存
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)shell调试方法
  • (转)母版页和相对路径
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .Net - 类的介绍
  • .NET Micro Framework 4.2 beta 源码探析
  • .net 程序发生了一个不可捕获的异常
  • .NET连接数据库方式
  • .net中我喜欢的两种验证码
  • []常用AT命令解释()
  • [Apio2012]dispatching 左偏树