3.NioEventLoop创建

137 阅读1分钟

创建过程

  • new NioEventLoopGroup() 线程组默认2*CPU
  • new ThreadPerTaskExecutor() 线程创建器
  • 构造NioEventLoop ->newChild()
  • 线程选择器 chooserFactory.newChooser()

进入NioEventLoopGroup()后,一路点进会看到以下几个过程 image.png image.png

线程创建器ThreadPerTaskExecutor

  • 每次执行任务都会创建一个线程实体
  • NioEventLoop命名规则是nioEventLoop-1-xx

进入ThreadPerTaskExecutor()就会发现每个任务都创建线程 image.png image.png 点进newDefaultThreadFactory()方法后一路深入会发现toPoolName,不难发现它的作用是将首字母N变为n,回到this处继续深入会看到命名前缀最后拼接的结果 image.png image.png image.png image.png image.png

构造NioEventLoop ->newChild()

  • 保存线程执行器ThreadPerTaskExecutor
  • 创建一个MpscQueue保存异步任务队列
  • 创建一个selector进行轮询

进入方法,选择NioEventLoopGroup,继续深入就会发现先调用super(),后续就会创建selector,进入super就会发现保存保存线程执行器和创建MpscQueue image.png image.png image.png image.png image.png image.png image.png

线程选择器chooserFactory.newChooser()

  • isPowerOfTwo判断是否是2的幂(2、4、8、16...)
  • 是就优化方法PowerOfTowEventExecutorChooser(index++ & (length-1))
  • 否就普通方法GenericEventExecutorChooser(abs(index++ % length)) image.png image.png image.png image.png image.png