欢迎访问宙启技术站
智能推送

Netty源码分析NioEventLoop线程的启动

发布时间:2023-05-16 16:24:38

Netty源码分析NioEventLoop线程的启动

NioEventLoop是Netty实现的核心组件之一,其具有多线程的特性,可以并发处理多个Channel的IO操作。在Netty中启动NioEventLoop的线程的过程相对比较复杂,需要依赖于许多其他的类和组件协同工作。本文将从源码的角度深入探究Netty中NioEventLoop线程的启动过程,为读者展现NioEventLoop线程究竟是如何启动的。

Netty中的线程模型

在深入分析NioEventLoop线程的启动之前,先简单介绍一下Netty中的线程模型。Netty中采用的是多线程Reactor模型,主要包括两类线程:

1. Boss线程:负责接收新的客户端连接,并创建新的Socket Channel对象,并且将新建立的连接注册到Worker线程的EventLoop中,形成一个连接池。

2. Worker线程:负责处理客户端的IO操作,每个Worker线程均绑定在一个EventLoop上,即一个EventLoop中可以包含多个Socket Channel。

在Netty中EventLoop是一个核心组件,它承载了整个NioEventLoop线程的逻辑,其中包含了一个Reactor、一个Selector、一个任务队列以及一个线程。它作为底层的基础组件,主要负责管理Channel的状态,以及执行相关的IO操作。

NioEventLoop线程的启动

NioEventLoop线程是由Boss线程创建的,具体的创建过程如下:

1. 调用ServerBootstrap对应的bind方法创建一个ServerChannel。

2. 内部创建一个AbstractBootstrap内部类ServerBootstrapAcceptor,该类实现了ChannelInboundHandler接口,其中accept方法用于处理新连接请求。

3. 将ServerBootstrapAcceptor注册到ServerChannel的pipline中,用于接受新的连接请求。

4. 在ServerBootstrapAcceptor类中创建NioEventLoopGroup,并传入一个NioEventLoopGroup线程的工厂实例。

5. 在NioEventLoopGroup构造函数中通过Executors.newSingleThreadExecutor创建线程池,并将它们作为一个EventExecutor数组封装到一个InternalThreadLocalMap中。

6. 在next()方法中获取一个EventExecutor选取规则是轮询,从线程池中获取一个线程实例,并返回。

7. 将NioEventLoopGroup中获取的线程实例注册到ServerChannel上,完成线程启动。

综上所述,NioEventLoop线程的启动是依赖于ServerBootstrapAcceptor的。当Boss线程接收到新的客户端连接的时候,它会将连接请求作为一个任务提交给ServerBootstrapAcceptor 对象,在ServerBootstrapAcceptor对象中会创建一个NioEventLoopGroup 实例,并且为其创建了一个内部维护的线程池。每当有新的Channel注册到NioEventLoopGroup上时,就会从线程池中选取一个线程,并将它绑定到当前Channel上,从而完成NioEventLoop线程的启动。