博客
关于我
Netty源码—2.Reactor线程模型一
阅读量:794 次
发布时间:2023-02-15

本文共 1642 字,大约阅读时间需要 5 分钟。

NioEventLoop核心原理解析

NioEventLoop问题整理

1.默认下Netty服务端起多少线程及何时启动?

默认情况下,Netty服务端会根据CPU核数的2倍创建线程。如果调用EventExecutor.execute(task)时,当前线程不是Netty的Reactor线程(即不是NioEventLoop对应的线程实体),则会启动当前线程作为Reactor线程。

2.Netty如何解决JDK空轮询问题?

Netty通过监控Selector的阻塞时间,如果发现某次阻塞时间过短(默认512次),则重建Selector,并将旧Selector上的键转移至新Selector上。这种机制有效避免了JDK空轮询问题。

3.Netty如何保证异步串行无锁化?

  • 场景一:当处理客户端Channel时,无需同步,直接支持多线程并发。
  • 场景二:ChannelHandler中的操作默认线程安全,无需同步。

Netty在外部线程调用EventLoop方法时,通过inEventLoop()判断线程是否为Reactor线程,不是则将操作封装为Task存入MPSC队列,待Reactor线程执行。

Reactor线程模型理解

Reactor线程模型主要分三部分:

1. NioEventLoop创建

  • 创建入口:通过new NioEventLoopGroup()创建NioEventLoopGroup实例。
  • 确定线程数:默认为2倍CPU核数,或传入指定数量。
  • 创建流程
  • 创建ThreadPerTaskExecutor线程执行器。
  • 使用for循环创建NioEventLoop线程。
  • 创建线程选择器EventExecutorChooser

2. NioEventLoop启动

  • NioEventLoopGroup的构造方法启动NioEventLoop线程池。
  • 每个NioEventLoop创建后,会初始化Selector和MPSC任务队列。

3. NioEventLoop执行

  • NioEventLoop线程执行循环,轮询Selector获取事件。
  • 处理完成后,将任务存入MPSC队列。

NioEventLoop创建详解

1. 创建入口

EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();

2. 确定线程数

  • 默认:2倍CPU核数。
  • 传入参数:具体线程数。

3. 创建流程

  • 线程执行器ThreadPerTaskExecutor负责创建线程。
  • NioEventLoop创建:通过newChild()方法构建每个NioEventLoop。
  • 线程选择器:使用EventExecutorChooserFactory创建选择器。
  • 4. 线程执行器ThreadPerTaskExecutor

    • 每次调用execute(Runnable)创建一个线程。
    • 线程实体为FastThreadLocalThread,支持ThreadLocal操作。

    5. 创建NioEventLoop

    • MultithreadEventExecutorGroup构造,每个NioEventLoop对应一个线程。
    • 绑定Selector和MPSC任务队列。

    6. 线程选择器EventExecutorChooser

    • 默认使用PowerOfTowEventExecutorChooserGenericEventExecutorChooser
    • 选择策略根据线程数是否为2的幂决定。

    7. NioEventLoopGroup创建总结

    • 线程数:2倍CPU核数,默认。
    • 每个NioEventLoop对应一个Selector和一个MPSC任务队列。
    • 线程选择器用于分配连接到特定NioEventLoop。

    通过以上机制,Netty实现了高效的非阻塞I/O模型,支持多线程并发和异步操作。

    转载地址:http://yvcfk.baihongyu.com/

    你可能感兴趣的文章
    Nexus(1):Nexus的安装与配置
    查看>>
    NFC技术:概述
    查看>>
    NFinal学习笔记 02—NFinalBuild
    查看>>
    NFS
    查看>>
    nfs mount 故障 mount.nfs: access denied by server while mounting 10.0.100.208:/backup_usb
    查看>>
    NFS Server及Client配置与挂载详解
    查看>>
    NFS 服务配置篇
    查看>>
    NFS共享文件系统搭建
    查看>>
    nfs复习
    查看>>
    NFS安装配置
    查看>>
    NFS服务器配置-服务启动与停止
    查看>>
    NFS的安装以及windows/linux挂载linux网络文件系统NFS
    查看>>
    NFS的常用挂载参数
    查看>>
    NFS网络文件系统
    查看>>
    NFS远程目录挂载
    查看>>
    nft文件传输_利用remoting实现文件传输-.NET教程,远程及网络应用
    查看>>
    NFV商用可行新华三vBRAS方案实践验证
    查看>>
    ng build --aot --prod生成文件报错
    查看>>
    ng 指令的自定义、使用
    查看>>
    ng6.1 新特性:滚回到之前的位置
    查看>>