Netty源码解析(3)-NioEventLoop

1、Netty服务端启动多少线程

2、Netty如何解决JDK空轮询bug

3、Netty如何保证异步串行无锁化

NioEventLoop创建

new NioEventLoopGroup() 线程组,默认2*cpu

  new ThreadPerTaskExecutor() 线程创建器,构造方法里面传入ThreadFactory,execute方法里面每次执行,nioEventLoop-1-xx线程命名规则,线程底层实现类是FastThreadLocalThread

  for(){new Child()} 构造NioEventLoop,保存线程执行器ThreadPerTaskExecutor,创建一个MpscQueue,创建一个绑定selector

  chooserFactory.newChooser(children) 判断是否是2的幂,如果是就会创建PowOfTwoEventExecutorChoose 优化 index++&length-1,循环取后几位,不是就返回GenericEventExecutorChooser普通abs(index++%length)

NioEventLoop服务端线程启动在AbstractChannel的register方法里面,

NioEventLoop启动

bind()->execute(task)入口

  startThread()->doStartThread()创建线程

  ThreadPerTaskExecutor.execute()

  thread = Thread.currentThread()

  NioEventLoop.run() 启动

NioEventLoop执行逻辑

NioEventLoop.run()

  select () 检查是否有io事件,deadline以及任务穿插逻辑处理,阻塞式select,避免jdk空轮询

  processSelectedKeys() 处理io事件 selected keyset优化,processSelectedKeysOptimized

  runAllTasks() 处理异步任务队列 task分类和任务的聚合任务的执行。task分类有两个定时任务和普通任务

 

  

posted on 2020-04-07 11:30  清浊  阅读(177)  评论(0)    收藏  举报