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

而这个实现又调用了子类SingleThreadEventExecutor的如下方法
    @Override    public boolean inEventLoop(Thread thread) {        return thread == this.thread;    }在服务端刚启动的时候,Thread.currentThread()就是当前 main 方法对应的主线程,而this.thread还没有开始赋值,所以此时为null,
【七 Netty 学习:NioEventLoop 对应线程的创建和启动源码说明】所以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);                        }                    });               ......            }        }其中executor方法对应的是SingleThreadEventExecutorexecute方法
    private void execute(Runnable task, boolean immediate) {        boolean inEventLoop = inEventLoop();        addTask(task);        if (!inEventLoop) {            startThread();            if (isShutdown()) {                ......            }        }        if (!addTaskWakesUp && immediate) {           ......        }    }

经验总结扩展阅读