Netty的EventLoop组件
主要功能
- 注册和移除 Channel 的读、写事件
- 轮询出感兴趣的 IO 事件
- 将 IO 事件分发给 ChannelHandler 进行处理
Tip
一个 EventLoop 在它的生命周期内只和一个 Thread 绑定,这样可以保证 ChannelHandler 的处理逻辑在同一个 Thread 中执行。
原理
- EventLoop 包含一个事件循环,它会不断进行事件轮询,看是否有感兴趣的 IO 事件发生。
- EventLoop 包含一个 [基础知识/操作系统/线程|线程],这个 线程 执行所有的 IO 事件和事件处理逻辑。一个 EventLoop 绑定一个 线程,这样可以保证一个 Channel 的 IO 事件和业务逻辑处理始终在同一个 线程 中执行。
- EventLoop 中维护一个 Selector(NIO 实现) 或者 EpollSelector(Epoll 实现),用于轮询 IO 事件。当有感兴趣的 IO 事件发生时,会将对应的 Channel 返回。
- EventLoop 中维护一个 Channel 集合,这些 Channel 都绑定到该 EventLoop 上,EventLoop 负责处理这些 Channel 上的 IO 事件。
- 当 EventLoop 的 Selector/EpollSelector 轮询出有 IO 事件发生的 Channel 时,会将这个 Channel 和对应的 IO 事件 (CONNECT、READ、WRITE 等) 分发给 ChannelPipeline 进行处理。
- 事件处理完成后,如果 Channel 还对某些 IO 事件感兴趣,则会将 Channel 再次注册到 Selector/EpollSelector 上。