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中。
