NioEventLoop
在初始化过程中,Client
和Server
用的 EventLoopGroup
是 NioEventLoopGroup
,而其内部是NioEventLoop
数组。
NioEventLoop并不是一个纯粹的I/O线程,还负责处理两类任务:
- 系统Task: 当I/O线程和用户线程同时操作网路资源时,为了防止并发操作导致的锁竞争,将用户线程的操作封装成 Task放入消息队列中,由I/O线程负责执行,这样就实现了局部无锁化;
- 定时任务: 通过
schedule
方法可以执行定时任务。
继续来看其run
方法:
1 | protected void run() { |
可以看到里面有个ioRatio
,表示IO任务的比例。
当为100%
时,先进行IO操作再执行任务;否则先进行IO操作,然后根据 IO操作的时间 来计算任务可以执行的时间长度。默认为50%。
再细看processSelectedKeys
:
1 | private void processSelectedKeys() { |
它遍历每个SelectionKey
,查看有哪些已经准备好的操作,根据准备好的事件进行相应的操作。
runAllTasks方法从 taskQueue
中获取所有的任务进行执行。对于taskQueue
维护着的业务方提交的任务。在执行其execute
方法的时候即把任务放进taskQueue
中。