Netty中EventLoopGroup的工作原理及线程数确定
详细阐述Netty EventLoopGroup的工作原理,包括EventLoop与线程的绑定关系、任务队列机制、以及Boss/Worker Group线程数的确定策略。
回答
古法程序员
EventLoopGroup核心原理:
1. EventLoop = Thread + Selector + TaskQueue
- 一个EventLoop对应一个永远不会停止的线程(NIOEventLoop),内部封装了Selector
- 多个Channel注册到同一个EventLoop上,该EventLoop轮询所有Channel的事件
- EventLoop还处理定时任务(scheduleAtFixedRate)和普通任务(execute)
2. 线程数确定
- Boss Group:通常设为1,负责accept连接
new NioEventLoopGroup(1)- 处理ServerSocketChannel的OP_ACCEPT事件
- Worker Group:默认值为
CPU核心数 × 2new NioEventLoopGroup()默认线程数 = 2 * Runtime.getRuntime().availableProcessors()- 也可手动指定:
new NioEventLoopGroup(16) - 每个EventLoop处理多个Channel的读写
3. Channel注册与负载均衡
- 调用
register()时,EventLoopGroup通过next()方法轮询选择一个EventLoop - select策略:默认
PowerOfTwoEventExecutorChooser(位运算取模) - 一旦注册,该Channel的所有操作都由这个EventLoop线程处理
4. 线程模型优势
- 避免了线程上下文切换开销
- 无锁化设计:ChannelHandler在同一个EventLoop中执行
- 实现了串行化无锁编程