而这个实现又调用了子类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
方法对应的是SingleThreadEventExecutor
的execute
方法
private void execute(Runnable task, boolean immediate) { boolean inEventLoop = inEventLoop(); addTask(task); if (!inEventLoop) { startThread(); if (isShutdown()) { ...... } } if (!addTaskWakesUp && immediate) { ...... } }
经验总结扩展阅读
- ZCTF note3:一种新解法
- 三七能长期吃吗
- 关于环境学习生活类的名言急
- 第七次人口普查内容包括什么
- 哪类人不宜吃三七
- 学习ASP.NET Core Blazor编程系列四——迁移
- 火影忍者中佐助鸣人居住学习的村子叫什么?
- 鲁班七号三技能怎么用
- 五 Netty 学习:服务端启动核心流程源码说明
- 七宝镇有什么好玩的