2023-09-13  阅读(13)
原文作者:https://blog.csdn.net/wangwei19871103/category_9681495_2.html 原文地址: https://blog.csdn.net/wangwei19871103/article/details/104755480

NioEventLoop

我们继续NioEventLoop的构造函数,这里就是对原生的selectedKeys做了优化。

202309132211387901.png

openSelector

先获取原生的Selector

202309132211445512.png
如果禁止优化就直接包装原生的返回:

202309132211451803.png

SelectorTuple

这个元组里面就是一个是原生的,一个是包装后的。

202309132211459904.png
反射出sun.nio.ch.SelectorImpl

202309132211467455.png
创建优化的SelectedSelectionKeySet

202309132211477246.png

SelectedSelectionKeySet

里面就是用数组来存SelectionKey,不够就扩容:

202309132211485557.png
直接内存操作,将原生的SelectorselectedKeyspublicSelectedKeys替换成selectedKeySet

202309132211492908.png
看原生的这两个属性已经改了:

202309132211504389.png
最后将原生的Selector封装成SelectedSelectionKeySetSelector,然后包装到元组返回:

2023091322115159110.png

SelectedSelectionKeySetSelector

其实就是代理了原生的Selector

2023091322115240011.png
一个是原生的一个是封装后的:

2023091322115334012.png
这个SelectedSelectionKeySet是共享的:

2023091322115452913.png
NioEventLoopGroup基本就这些了,其他的我在另外文章讲过就不多说了,我们来看看ServerBootstrap吧。

ServerBootstrap创建

选项和属性是两个并发安全的hashmap,然后创建一个ServerBootstrapConfig配置。

2023091322115616114.png

NioServerSocketChannel创建

获取原生ServerSocketChannelImpl对象

ServerBootstrapbind里,会用反射创建NioServerSocketChannel

2023091322115705615.png
默认的选择器提供器:

2023091322115789116.png
就是获取一个NIO原生的ServerSocketChannel的实现类sun.nio.ch.ServerSocketChannelImpl对象,毕竟netty只是做了封装,底层的操作还是原生的来做。

2023091322115865617.png

2023091322120021018.png

传入监听事件OP_ACCEPT

这里NioServerSocketChannel默认监听的事件就是OP_ACCEPT

2023091322120111819.png

在原生的通道上设置监听事件OP_ACCEPT

就是在原生的上面设置:

2023091322120191720.png

创建配置NioServerSocketChannelConfig

2023091322120300321.png
先获取javaChannel

2023091322120536022.png
就是我们刚才获取的原生通道:

2023091322120627723.png
然后到这里:

2023091322120704824.png

DefaultChannelConfig属性初始化ByteBufAllocator

这里就是字节分配器创建的地方,我们来看看他会是什么。

2023091322120862225.png
然后是这里。

2023091322121017826.png

ByteBufUtil的初始化

分配器是这个:

2023091322121112627.png
不是安卓的就是用池化的分配器:

2023091322121256728.png

2023091322121390329.png
所以我们知道我们用的是池化的分配器。

会到这里,会创建一个AdaptiveRecvByteBufAllocator,可调节的接收缓冲区,后面会详细讲。

2023091322121466130.png

与写相关的属性

这里自旋发送的次数,就是最多发送16次,将缓冲区的数据发出去,然后自动读就是每当读事件处理完了,还会继续监听读事件,还有写水位设置,就是写缓冲区超过64K的时候就不可写了,要小于32K才可写,会触发通道的写能力改变事件channelWritabilityChanged

2023091322121538731.png
写的可能比较碎,因为有些东西已经讲过,重复讲没必要,讲一些前面没关注的东西。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。


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] ,回复【面试题】 即可免费领取。

阅读全文