Netty的线程模型
1.Reactor单线程模型
2.Reactor多线程
3.主从Reactor多线程模型
4.Netty的线程模型
最佳实战
NioEventLoop源码分析
在Netty中它的“线程池”和“线程”分别用NioEventLoopGroup和NioEventLoop来表示
设计原理
服务端启动的时候,创建了两个 NioEventLoopGroup,它们实际是两个独立的 Reactor线程池。一个用于接收客户端的TCP连接,另一个用于处理IO相关的读写操作,或者执行系统Task、定时任务Task等。
作为NIO创建的Reactor线程,NioEventLoop需要处理网络IO读写事件,因此它必须聚合一个多路复用器对象
总结:
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 的值进行调整来防止队列中任务积攒过多