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

    你可能感兴趣的文章
    mysql面试题学校三表查询_mysql三表查询分组后取每组最大值,mysql面试题。
    查看>>
    Mysql面试题精选
    查看>>
    MySQL面试题集锦
    查看>>
    mysql颠覆实战笔记(八)--mysql的自定义异常处理怎么破
    查看>>
    mysql驱动、durid、mybatis之间的关系
    查看>>
    mysql驱动支持中文_mysql 驱动包-Go语言中文社区
    查看>>
    MySQL高可用切换_(5.9)mysql高可用系列——正常主从切换测试
    查看>>
    MySQL高可用解决方案详解
    查看>>
    MYSQL高可用集群MHA架构
    查看>>
    MySQL高级-MySQL并发参数调整
    查看>>
    MySQL高级-MySQL查询缓存优化
    查看>>
    MySQL高级-MySQL锁
    查看>>
    MySQL高级-SQL优化步骤
    查看>>
    MySQL高级-内存管理及优化
    查看>>
    MySQL高级-视图
    查看>>
    MySQL高级-触发器
    查看>>
    mysql高级查询~分页查询
    查看>>
    MySQL高频面试题
    查看>>
    MySQL(2)DDL详解
    查看>>
    Mysql,sql文件导入和导出
    查看>>