Netty(三)关于NioEventLoopGroup

学一学Netty中的NioEventLoopGroup

  • 一个Netty程序启动时,至少要指定一个EventLoopGroup
  • 假如我们使用NIO,那我们通常使用NioEventLoopGroup
  • 使用BIO,那我们可以初始化OioEventLoopGroup

官方DOC

在这里插入图片描述

  • 上图时Netty(4.1.6)中EventLoopGroup的解释
  • 在事件循环期间可对EventExecutorGroup进行Channel的注册,然后供后续使用
  • 到这里有一个模糊的概念,EventLoopGroup可以对Channel进行注册

方法实现

  • 通过其提供的接口方法可以发现EventLoopGroup定义了Channel的注册规范

在这里插入图片描述

EventLoopGroup结构图

父结构

在这里插入图片描述

  • 这里发现它的顶层父类是Executor对象。我们知道Netty是基于Java实现的RPC框架
  • 那么看到这里不难理解,EventLoopGroup其实是和线程相关的
  • Netty本质又是Reactor模型的实现,那么EventLoopGroup和Reactor肯定是有关系的

EventLoopGroup与Reactor

  • 还是熟悉的代码
EventLoopGroup workerGroup = new NioEventLookGroup();
Bootstrap boot = new Bootstrap();
boot.group(workerGroup);
  • 这里初始化了一个NioEventLookGroup对象,那么先来看一下EventLoopGroup的子结构
    在这里插入图片描述

  • 通过其子结构类图可以发现一些端倪

SingleThreadEventLoop       :   在一个线程中执行所有提交的任务
MultithreadEventLoopGroup   :   多线程并发处理提交的任务
EmbeddedEventLoop           :   用来测试 
ThreadPerChannelEventLoop   :   提供OIO的处理模式,每一个EventLoop对应一个线程对应一个Channel

通过NioEventLoopGroup窥视其冰山一角

  • NioEventLoopGroup官方DOC
    • 使用NIO模型,基于Channel选择了Selector选择器

在这里插入图片描述

  • 初始化
    • 未传入参数的话,使用默认线程数。并且在初始化过程中创建一个SelectorProvider对象,后续用来提供Selector
    • 默认线程数:处理器数 * 2

在这里插入图片描述

Bootstrap—group方法

  • 客户端实现
EventLoopGroup workerGroup = new NioEventLookGroup();
Bootstrap boot = new Bootstrap();
boot.group(workerGroup);
  • 服务端实现
EventLoopGroup group = new NioEventLookGroup();
// 与客户端不同,服务端使用 ServerBootstrap
ServerBootstrap boot = new ServerBootstrap();
boot.group(group);
  • 服务端group方法实现
    • 这里我们可以发现,服务端的boss线程和worker线程实际上是同一个线程

在这里插入图片描述

  • 到这里我们可以发现,当我们设置单线程的时候。
  • NioEventLoopGroup线程池的数量只设置为1
  • Netty中的Acceptor和后续所有的接收到的请求都是在一个线程中处理的
  • 对应Reactor线程模型,就相当于Reactor的单线程模型
单线程模型
EventLoopGroup group = new NioEventLookGroup();
// 与客户端不同,服务端使用 ServerBootstrap
ServerBootstrap boot = new ServerBootstrap();
boot.group(group);
多线程模型
//  设置   n > 1的线程数,当然要合理,不能无限大
EventLoopGroup group = new NioEventLookGroup(n);
// 与客户端不同,服务端使用 ServerBootstrap
ServerBootstrap boot = new ServerBootstrap();
boot.group(group);
主从线程模型
EventLoopGroup boos = new NioEventLookGroup();
EventLoopGroup work = new NioEventLookGroup();
// 与客户端不同,服务端使用 ServerBootstrap
ServerBootstrap boot = new ServerBootstrap();
boot.group(boos, worker);
  • 看代码,通过对parentGroup和childGroup进行不同的处理,确定其不同的工作职责

在这里插入图片描述

NioEventLoopGroup如何工作的

  • 现在,对NioEventLoopGroup的作用以及原理有了一个基本的认识
  • 那么当任务过来的时候是如何被执行的呢

NioEventLoopGroup的实例化

  • 通过其实例化过程入手
  • 调用到 其父类 MultithreadEventLoopGroup 的构造方法,进行线程相关参数的设置

在这里插入图片描述

  • 调用到 MultithreadEventExecutorGroup 的 构造方法,重点看其中的 newChild 方法

    • 根据线程数量做循环
      在这里插入图片描述
  • 又回调到 NioEventLoopGroup 的 newChild 方法

在这里插入图片描述

  • 走到 NioEventLoop 的构造方法
    • 走到这里看到了熟悉的方法openSelector()选择器出现了

在这里插入图片描述

NioEventLoopGroup工作模型

在这里插入图片描述

<think>好的,我现在需要回答用户关于NettyNioEventLoopGroup构造方法的问题。首先,我得回忆一下Netty的相关知识,特别是NioEventLoopGroup的构造方法。 我记得NioEventLoopGroupNetty中处理I/O事件和任务的线程池,属于Reactor线程模型的一部分。它的构造方法有几个不同的重载版本,可能涉及线程数量、线程工厂、选择器策略等参数。 首先,应该确认构造方法的不同参数组合。比如默认无参构造方法,可能使用默认的线程数,也就是CPU核心数的两倍。然后可能有指定线程数的构造方法,比如传入一个int类型的nThreads参数。接着,可能还有接受ThreadFactory参数的构造方法,允许用户自定义线程创建方式。此外,可能还有结合SelectorProvider和选择策略的构造方法,比如使用特定的Provider来创建Selector,以及不同的策略来选择任务队列等。 需要检查这些构造方法是否存在。例如,NioEventLoopGroup是否有接受Executor、SelectorProvider、SelectStrategyFactory等参数的构造方法。另外,可能还有使用默认参数的构造方法,比如不指定线程数时自动计算。 接下来,我需要确认每个构造方法的具体作用。比如,指定线程数可以控制事件循环的并发线程数量;ThreadFactory可以自定义线程的名称、优先级等属性;SelectorProvider可能用于不同的平台或测试场景;选择策略则影响事件循环的行为,比如如何处理任务队列。 另外,需要注意不同Netty版本的差异,但用户没有指定版本,这里应该以较新的稳定版为准。此外,可能需要提及这些构造方法如何影响Netty的性能和资源管理,比如线程数过多或过少的影响,或者使用自定义线程工厂的好处。 最后,要组织这些信息,分点列出各个构造方法,并简要说明每个参数的作用。确保使用正确的中文术语,避免技术术语错误,同时保持回答结构清晰,易于理解。</think>Netty中的`NioEventLoopGroup`是处理I/O事件的核心线程池,其构造方法主要有以下几种形式: --- ### **1. 无参构造** ```java public NioEventLoopGroup() ``` - **作用**:使用默认线程数(CPU核心数 × 2)和默认配置创建线程组。 - **底层逻辑**:自动检测可用处理器核心数,适用于一般场景。 --- ### **2. 指定线程数** ```java public NioEventLoopGroup(int nThreads) ``` - **参数**:`nThreads` 定义事件循环线程数量。 - **用途**:手动控制并发线程数,优化资源分配(如高并发场景可适当增加)。 --- ### **3. 自定义线程工厂** ```java public NioEventLoopGroup(int nThreads, ThreadFactory threadFactory) ``` - **参数**: - `nThreads`:线程数量。 - `threadFactory`:自定义线程创建逻辑(如命名、优先级等)。 - **典型场景**:统一线程命名(如监控工具识别)或设置守护线程。 --- ### **4. 指定SelectorProvider** ```java public NioEventLoopGroup(int nThreads, SelectorProvider selectorProvider) ``` - **参数**: - `nThreads`:线程数量。 - `selectorProvider`:用于创建`Selector`的底层实现。 - **用途**:跨平台兼容或测试时替换默认Selector(如MacOS的KQueue)。 --- ### **5. 完整参数构造** ```java public NioEventLoopGroup( int nThreads, ThreadFactory threadFactory, SelectorProvider selectorProvider, SelectStrategyFactory selectStrategyFactory ) ``` - **参数**: - `nThreads`:线程数。 - `threadFactory`:自定义线程工厂。 - `selectorProvider`:Selector实现。 - `selectStrategyFactory`:事件循环策略(控制任务执行优先级)。 - **高级控制**:深度优化事件循环行为(如平衡I/O与任务处理)。 --- ### **关键特性** - **资源管理**:默认线程数为`Runtime.getRuntime().availableProcessors() * 2`,平衡性能与开销。 - **Selector优化**:通过`SelectorProvider`实现不同操作系统的高效I/O模型(如Linux的Epoll)。 - **线程模型**:每个`NioEventLoop`绑定一个线程,处理多路复用I/O和执行异步任务。 --- **示例代码**: ```java // 创建含4个线程的NIO事件组,自定义线程名称 NioEventLoopGroup group = new NioEventLoopGroup(4, new DefaultThreadFactory("NettyWorker", true) ); ``` 通过合理选择构造方法,可优化Netty应用的性能和可维护性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值