EventLoop继承图
说明:
1.ScheduledExcecutorService 接口表示是一个定时任务接口,EventLoop可以接收定时任务
2.EventLoop接口:一旦Channel注册了,就处理该Channel对应的所有IO操作
3.SingleThreadEventLoop表示这是一个单个线程的线程池
4.EventLoop是一个单例线程池,里面有一个死循环不断做着三件事:监听端口,处理端口事件,处理队列事件。每个EventLoop都可以绑定多个Channel,而每个Channel始终只能由一个EventLoop来处理
NioEventLoop的使用—-execute方法
说明:
1.首先判断该EventLoop的线程是否是当前线程,如果是,直接添加到任务队列中去,如果不是,则尝试启动线程(因为单个线程只能启动一次,第一次进入需要启动线程),随后再将任务添加到队列中
2.如果线程已经停止,并且删除任务失败,则执行拒绝策略,默认是抛出异常
3.如果addTaskWakesUp 是 false,并且任务不是NonWakeupRunnable类型的,就尝试唤醒selector,这个时候阻塞在selector的线程就会立即返回
EventLoop 作为Netty的核心的运行机制小结
1.每次执行ececute方法都是向都是在向队列中添加任务,当第一次添加时就启动线程,执行run方法,而run方法是整个EcentLoop的核心,循环做三件事
1.调用selector的select方法,默认阻塞1s,如果有定时任务,则在定时任务剩余时间的基础上加0.5s进行阻塞。当执行execute方法的时候,也就是添加任务时,唤醒selector,防止selector阻塞时间过长
2.当selector返回的时候,会调用processSelectedKeys方法对selectKey进行处理
3.当processSelectedKeys方法执行结束后,则按照 ioRatio 的比例执行runAllTasks方法,默认是IO任务时间和非IO任务时间是相同的,可以对 ioRatio 的值进行调整来防止队列中任务积攒过多