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分类有两个定时任务和普通任务
浙公网安备 33010602011771号