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

inEventLoop()经过上述分析,为false,所以执行startThread()方法
    private void startThread() {        if (state == ST_NOT_STARTED) {            if (STATE_UPDATER.compareAndSet(this, ST_NOT_STARTED, ST_STARTED)) {                boolean success = false;                try {                    doStartThread();                    success = true;                } finally {                    if (!success) {                        STATE_UPDATER.compareAndSet(this, ST_STARTED, ST_NOT_STARTED);                    }                }            }        }    }这里主要的逻辑就是判断线程是否启动,如果没有启动,就调用doStartThread()启动 。doStartThread()的逻辑是
private void doStartThread() {        assert thread == null;        executor.execute(new Runnable() {            @Override            public void run() {                thread = Thread.currentThread();                ...                SingleThreadEventExecutor.this.run();                ......            }        });    }通过一个成员变量thread来保存ThreadPerTaskExecutor创建出来的线程(即:FastThreadLocalThread),NioEventLoop 保存完线程的引用之后,随即调用 run 方法 。
workGroup 对应的 NioEventLoop 创建线程和启动workGroup 对应的 NioEventLoop 创建的线程主要做如下事情

  1. 执行一次事件轮询 。首先轮询注册到 Reactor 线程对应的 Selector 上的所有 Channel 的 IO 事件 。
  2. 处理产生 IO 事件的 Channel 。如果有读写或者新连接接入事件,则处理:
  3. 处理任务队列 。
以上三个步骤分别对应了下述三个方法
事件轮询事件轮询调用了NioEventLoop的如下方法
    private int select(long deadlineNanos) throws IOException {        if (deadlineNanos == NONE) {            return selector.select();        }        // Timeout will only be 0 if deadline is within 5 microsecs        long timeoutMillis = deadlineToDelayNanos(deadlineNanos + 995000L) / 1000000L;        return timeoutMillis <= 0 ? selector.selectNow() : selector.select(timeoutMillis);    }

经验总结扩展阅读