NioEventLoop
我们继续NioEventLoop
的构造函数,这里就是对原生的selectedKeys
做了优化。
openSelector
先获取原生的Selector
:
如果禁止优化就直接包装原生的返回:
SelectorTuple
这个元组里面就是一个是原生的,一个是包装后的。
反射出sun.nio.ch.SelectorImpl
:
创建优化的SelectedSelectionKeySet
:
SelectedSelectionKeySet
里面就是用数组来存SelectionKey
,不够就扩容:
直接内存操作,将原生的Selector
的selectedKeys
和publicSelectedKeys
替换成selectedKeySet
:
看原生的这两个属性已经改了:
最后将原生的Selector
封装成SelectedSelectionKeySetSelector
,然后包装到元组返回:
SelectedSelectionKeySetSelector
其实就是代理了原生的Selector
:
一个是原生的一个是封装后的:
这个SelectedSelectionKeySet
是共享的:
NioEventLoopGroup
基本就这些了,其他的我在另外文章讲过就不多说了,我们来看看ServerBootstrap
吧。
ServerBootstrap创建
选项和属性是两个并发安全的hashmap
,然后创建一个ServerBootstrapConfig
配置。
NioServerSocketChannel创建
获取原生ServerSocketChannelImpl对象
ServerBootstrap
的bind
里,会用反射创建NioServerSocketChannel
。
默认的选择器提供器:
就是获取一个NIO
原生的ServerSocketChannel
的实现类sun.nio.ch.ServerSocketChannelImpl
对象,毕竟netty只是做了封装,底层的操作还是原生的来做。
传入监听事件OP_ACCEPT
这里NioServerSocketChannel
默认监听的事件就是OP_ACCEPT
:
在原生的通道上设置监听事件OP_ACCEPT
就是在原生的上面设置:
创建配置NioServerSocketChannelConfig
先获取javaChannel
:
就是我们刚才获取的原生通道:
然后到这里:
DefaultChannelConfig属性初始化ByteBufAllocator
这里就是字节分配器创建的地方,我们来看看他会是什么。
然后是这里。
ByteBufUtil的初始化
分配器是这个:
不是安卓的就是用池化的分配器:
所以我们知道我们用的是池化的分配器。
会到这里,会创建一个AdaptiveRecvByteBufAllocator
,可调节的接收缓冲区,后面会详细讲。
与写相关的属性
这里自旋发送的次数,就是最多发送16
次,将缓冲区的数据发出去,然后自动读就是每当读事件处理完了,还会继续监听读事件,还有写水位设置,就是写缓冲区超过64K
的时候就不可写了,要小于32K
才可写,会触发通道的写能力改变事件channelWritabilityChanged
。
写的可能比较碎,因为有些东西已经讲过,重复讲没必要,讲一些前面没关注的东西。
好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。