FileChannel
(通道) 和 方法 transferFrom
, 完成文件的拷贝
选择器Selector核心:selector能够检测多个注册的通道上是否有事件发生(多个channel以事件的方式可以注册到同一个selector) , 如果有事件发生 , 便获取事件然后针对每个事件进行相应的处理 。这样就可以做到只使用一个单线程去管理多个通道 。
只有在连接/通道真正有读写事件发生时 , 才会进行读写
, 就大大地减少了系统开销 , 并且不必为每个连接都创建一个线程 , 不用去维护多个线程 。
原理图:

文章插图
说明:
- 当客户端连接时 , 会通过
ServerSocketChannel
得到SocketChannel
。
- Selector进行监听select方法 , 返回有事件发生的通道的个数 。
- 将
socketChannel
注册到Selector上 , register(),一个selector上可以注册多个SocketChannel
。
- 注册后返回一个
selectionKey
,会和该selector关联 。
- 进一步得到各个
selectionKey
(有事件发生) 。
- 再通过
selectionKey
反向获取socketChannel
, 方法channel() 。
- 可以通过得到的channel,完成业务逻辑 。

文章插图
有了
NIO
为什么还需要Netty?不需要过于关注底层的逻辑 ,
对下面的sdk等进行封装 , 相当于简化和流程化了NIO的开发过程
。spring
和springboot
的关系差不多 。因为
Netty 5
出现重大bug , 已经被官网废弃了 , 目前推荐使用的是Netty 4.x
的稳定版本 。Netty高性能架构设计线程模型基本介绍

文章插图
传统阻塞 I/O 服务模型

文章插图
模型特点:
- 采用阻塞IO模式获取输入的数据
- 每个连接都需要独立的线程完成数据的输入 , 业务处理 , 数据返回
- 当并发数很大 , 就会创建大量的线程 , 占用很大系统资源
- 连接创建后 , 如果当前线程暂时没有数据可读 , 该线程会阻塞在read操作 , 造成线程资源浪费

文章插图
Reactor在一个单独的线程中运行 , 负责监听和分发事件 , 分发给适当的处理程序来对IO事件作出反应 。它像公司的电话接线员 , 接听来自客户的电话并将线路转译到适当的联系人 。
单 Reactor 单线程

文章插图
- 优点:模型简单 , 没有多线程、进程通信、竞争问题 , 全部都在一个线程中完成 。
- 缺点:性能问题 , 只有一个线程 , 无法完全发挥多核CPU性能 。Handler在处理某个连接上的业务时 , 整个进程无法处理其他连接事件 , 很容易导致性能瓶颈 。
经验总结扩展阅读
- 高三物理学习方法技巧是什么 有哪些窍门
- 给朋友的腊八节祝福语
- 腊八节经典祝福文案15篇
- 腊八节祝福语集合
- 腊八节最暖心祝福语2023
- 国庆节姐姐祝福语2023
- 国庆节祝福姐姐的祝福语
- 银行国庆节短信祝福
- 2023国庆节祝福语
- 2023祝朋友七夕快乐的祝福语