创建过程
- new NioEventLoopGroup() 线程组默认2*CPU
- new ThreadPerTaskExecutor() 线程创建器
- 构造NioEventLoop ->newChild()
- 线程选择器 chooserFactory.newChooser()
进入NioEventLoopGroup()后,一路点进会看到以下几个过程
![]()
线程创建器ThreadPerTaskExecutor
- 每次执行任务都会创建一个线程实体
- NioEventLoop命名规则是nioEventLoop-1-xx
进入ThreadPerTaskExecutor()就会发现每个任务都创建线程
![]()
点进newDefaultThreadFactory()方法后一路深入会发现toPoolName,不难发现它的作用是将首字母N变为n,回到this处继续深入会看到命名前缀最后拼接的结果
![]()
![]()
![]()
![]()
构造NioEventLoop ->newChild()
- 保存线程执行器ThreadPerTaskExecutor
- 创建一个MpscQueue保存异步任务队列
- 创建一个selector进行轮询
进入方法,选择NioEventLoopGroup,继续深入就会发现先调用super(),后续就会创建selector,进入super就会发现保存保存线程执行器和创建MpscQueue
![]()
![]()
![]()
![]()
![]()
![]()
线程选择器chooserFactory.newChooser()
- isPowerOfTwo判断是否是2的幂(2、4、8、16...)
- 是就优化方法PowerOfTowEventExecutorChooser(index++ & (length-1))
- 否就普通方法GenericEventExecutorChooser(abs(index++ % length))