分类: 云计算
2022-09-26 10:26:42
将具体代码实现前,先来谈谈Netty的线程模型。正如许多博客所提到的,Netty采用了Reactor模式,但是许多博客也只是提到了而已,同时大家也不会忘记附上几张Doug Lee大神的图,但是并不会深入的解释。为了更好的学习和理解Netty的线程模型,我在这里稍微详细的说一下我对它的理解。
Reactor模式有多个变种,Netty基于Multiple Reactors模式做了一定的修改,Mutilple Reactors模式有多个reactor:mainReactor和subReactor,其中mainReactor负责客户端的连接请求,并将请求转交给subReactor,后由subReactor负责相应通道的IO请求,非IO请求(具体逻辑处理)的任务则会直接写入队列,等待worker threads进行处理。
Netty的线程模型基于Multiple Reactors模式,借用了mainReactor和subReactor的结构,但是从代码里看来,它并没有Thread Pool这个东东。Netty的subReactor与worker thread是同一个线程,采用IO多路复用机制,可以使一个subReactor监听并处理多个channel的IO请求,我给称之为:「Single Thread with many Channel」。
parentGroup和childGroup是Bootstrap构造方法中传入的两个对象,这两个group均是线程池,childGroup线程池会被各个subReactor充分利用,parentGroup线程池则只是在bind某个端口后,获得其中一个线程作为mainReactor。上图我将subReactor和worker thread合并成了一个个的loop,具体的请求操作均在loop中完成,下文会对loop有个稍微详细的解释。另附Doug Lee大神的Reactor介绍:Scalable IO in Java
以上均是Nio情况下。Oio采用的是Thread per Channel机制,即每个连接均创建一个线程负责该连接的所有事宜。
EventLoop和EventExecutor的实现原理
EventLoop和EventExecutor实现共有4个主要逻辑接口,EventLoop、EventLoopGroup、EventExecutor、EventExecutorGroup,内部实现、继承的逻辑表示无法直视,有种擦边球的感觉。
EventLoopGroup类介绍:
主要方法是newChild,我理解为EventLoop的工厂类。**EventLoopGroup.newChild创建**EventLoop对象。OioEventLoopGroup除外,它没有实现newChild方法,调用父类的并创建ThreadPerChannelEventLoop对象。
EventLoop类介绍:
主要方法是run(),是整个Netty执行过程的逻辑代码实现,后面细说。
EventExecutorGroup类介绍:
线程池实现,主要成员是children数组,主要方法是next(),获得线程池中的一个线程,由子类调用。由于Oio采用的是Thread per Channel机制,所以没有实现前面两个。即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询
EventExecutor类介绍:
Task的执行类,主要成员是taskQueue以及真正的运行线程对象executor,主要方法是taskQueue操作方法execute、takeTask、addTask等,以及doStartThread方法,后面细说。