在前面章节中我们也介绍过NioEventLoop内容.它有点类似Netty的'大动脉', 驱动整个Netty的运作.
学习NioEventLoop, 需要掌握三个步骤: 创建 启动 执行.
当我们通过代码new NioEventLoopGroup()时, 默认创建2倍CPU 个NioEventLoop. 图中在NioEventLoop周围环绕的都属于NioEventLoop的成员属性.
当我们针对某一个NioEventLoop首次执行任务时, 这个时候ThreadPerTaskExecutor会通过ThreadFactory创建一个FastThreadLocalThread. FastThreadLocalThread继承自java.lang.Thread, 所以说FastThreadLocalThread也是一个线程, 并且会将这个线程赋值给thread属性. 一个NioEventLoop有且只和一个thread关联. 这个线程负责轮询IO事件, 处理IO事件, 执行taskQueue里面的任务等.
当我们的业务线程执行写操作时, 底层默认判断如果不是NioEventLoop关联的那个thread线程, 就会将任务放入taskQueue中. 保证异步串行无锁化.
在图中我们还看到有个Selector, 它就是用来实现多路复用. 当多个客户端连接到服务器时, 每个NioEventLoop会被'分配'到多个客户端连接, 通过Selector进行轮询IO事件, 实现多路复用. 在前面章节我们也说过, 这个Selector默认底层使用HashSet装载SelectionKey. 而Netty对其优化, 通过反射, 底层使用数组装载SelectionKey, 时间复杂度O(1).