博客
关于我
Netty源码—2.Reactor线程模型一
阅读量:789 次
发布时间: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/

    你可能感兴趣的文章
    Neat Stuff to Do in List Controls Using Custom Draw
    查看>>
    Necurs僵尸网络攻击美国金融机构 利用Trickbot银行木马窃取账户信息和欺诈
    查看>>
    NeHe OpenGL教程 07 纹理过滤、应用光照
    查看>>
    NeHe OpenGL教程 第四十四课:3D光晕
    查看>>
    Neighbor2Neighbor 开源项目教程
    查看>>
    neo4j图形数据库Java应用
    查看>>
    Neo4j图数据库_web页面关闭登录实现免登陆访问_常用的cypher语句_删除_查询_创建关系图谱---Neo4j图数据库工作笔记0013
    查看>>
    Neo4j图数据库的介绍_图数据库结构_节点_关系_属性_数据---Neo4j图数据库工作笔记0001
    查看>>
    Neo4j图数据库的数据模型_包括节点_属性_数据_关系---Neo4j图数据库工作笔记0002
    查看>>
    Neo4j安装部署及使用
    查看>>
    Neo4j电影关系图Cypher
    查看>>
    Neo4j的安装与使用
    查看>>
    Neo4j(1):图数据库Neo4j介绍
    查看>>
    Neo4j(2):环境搭建
    查看>>
    Neo4j(4):Neo4j - CQL使用
    查看>>
    Neo图数据库与python交互
    查看>>
    NEO改进协议提案1(NEP-1)
    查看>>
    Neo私链
    查看>>
    NervanaGPU 项目使用教程
    查看>>
    Nerves 项目教程
    查看>>