七 Netty 学习:NioEventLoop 对应线程的创建和启动源码说明

原文地址:
博客园: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);                        }                    });               ......            }        }

推荐阅读