原文地址:
博客园:Netty 学习(七):NioEventLoop 对应线程的创建和启动源码说明
CSDN:Netty 学习(七):NioEventLoop 对应线程的创建和启动源码说明
说明在 Netty 服务端代码中,我们一般会创建了两个 NioEventLoopGroup:bossGroup 和 workerGroup
其中: bossGroup
用于监听端口,接收新连接的线程组;workerGroup
用于处理每一个连接的数据读写的线程组 。
bossGroup 创建第一个 NioEventLoop 线程NioEventLoop 的启动入口在AbstractUnsafe
@Override public final void register(EventLoop eventLoop, final ChannelPromise promise) { ...... AbstractChannel.this.eventLoop = eventLoop; if (eventLoop.inEventLoop()) { register0(promise); } else { try { eventLoop.execute(new Runnable() { @Override public void run() { register0(promise); } }); } catch (Throwable t) { logger.warn( "Force-closing a channel whose registration task was not accepted by an event loop: {}", AbstractChannel.this, t); closeForcibly(); closeFuture.setClosed(); safeSetFailure(promise, t); } } }其中inEventLoop()
方法调用的是AbstractEventExecutor
的实现
@Override public boolean inEventLoop() { return inEventLoop(Thread.currentThread()); }而这个实现又调用了子类SingleThreadEventExecutor
的如下方法
【七 Netty 学习:NioEventLoop 对应线程的创建和启动源码说明】 @Override public boolean inEventLoop(Thread thread) { return thread == this.thread; }在服务端刚启动的时候,Thread.currentThread()
就是当前 main 方法对应的主线程,而this.thread
还没有开始赋值,所以此时为null,
所以eventLoop.inEventLoop()
在一开始调用的时候,返回的是 false,进入AbstractUnsafe
的如下else
逻辑中
@Override public final void register(EventLoop eventLoop, final ChannelPromise promise) { ...... AbstractChannel.this.eventLoop = eventLoop; // 首次执行的时候 eventLoop.inEventLoop() 返回 false,执行 else 逻辑 if (eventLoop.inEventLoop()) { ...... } else { ...... eventLoop.execute(new Runnable() { @Override public void run() { register0(promise); } }); ...... } }
推荐阅读
- ZCTF note3:一种新解法
- 学习ASP.NET Core Blazor编程系列四——迁移
- 五 Netty 学习:服务端启动核心流程源码说明
- 【前端必会】走进webpack生命周期,另类的学习方法
- opencvcv.line
- 骰子五个点怎么玩(骰子五个六五个七怎么玩)
- 三十六 Java开发学习----SpringBoot三种配置文件解析
- 4 MySQL学习---MySQL索引
- 基础&进阶 线段树学习笔记(一) | P3372 【模板】线段树 1 题解
- 王者荣耀七周年击败特效怎么领取