1、Reactor基于I/O复用模型:多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接,当某个连接有新的数据可以处理时,操作系统通知应用程序,线程从阻塞状态返回,开始进行业务处理。基于线程池复用线程资源:不必再为每个连接创建线程,将连接完成后的业务处理任务分配给线程进行处理,一个线程可以处理多个连接的业务。
2.单Reactor多线程模型:
①Reactor对象通过select监控客户端请求事件,收到事件后,通过dispatch进行分发②如果建立连接请求,则由acceptor通过accept处理连接请求,然后创建一个Handler对象处理完成连接后的各种事件③如果不是连接请求,则由reactor分发调用连接对应的handler来处理④handler只负责响应事件,不做具体的业务处理,通过read读取数据后,会分发给后面的worker线程池的某个线程处理业务⑤worker线程池会分配独立线程完成真正的业务,并将结果返回给handler⑥handler收到响应后,通过send将结果返回给client.
3.主从Reactor多线程:
①Reactor主线程MainReactor对象通过select监听连接事件,收到事件后,通过acceptor处理连接事件②当acceptor处理连接事件后,mainReactor将连接分配给subreactor③subreactor将连接加入到连接队列进行监听,并创建handler进行各种事件处理④当有新事件发生时,subreactor就会调用对应的handler处理⑤handler通过read读取数据,分发给后面的worker线程处理⑥worker线程池分配独立的worker线程进行业务处理,并返回结果⑦handler收到响应的结果后,在通过send将结果返回给client⑧reactor主线程可以对应多个reactor子线程,即mainReactor可以关联多个subReactor.
4.Netty模型
①Netty抽象出两组线程池BossGroup专门负责接收客户端的连接,WorkerGroup专门负责网络的读写②BossGroup和WOK而Group类型都是NioEventLoopGroup③NioEventLoopGroup相当于一个事件循环组,这个组中含有多个事件循环,每个事件循环是NioEventLoop④NioEventLoop表示一个不断循环的执行处理任务的线程,每个NioEventLoop都有一个selector,用于监听绑定在其上的socket的网络通讯⑤NioEventLoopGroup可以有多个线程,即可以含有多个NioEventLoop⑥每个BossNioEventLoop循环执行的步骤有三部一轮询accept事件二处理accept事件,与client建立连接,生成NioSocketChannel,并将其注册到某个Worker NIOEventLoop上的selector三处理任务队列的任务,即runAllTasks⑦每个Worker NIOEventLoop循环执行的步骤一轮询read,write事件二处理i/o事件,即read,writer事件,在对应的NioSocketChannel处理三处理任务队列的任务,即runAllTasks