前言
Reactor模型是基于事件驅動的線程模型,可以分為Reactor單線程模型、Reactor多線程模型、主從Reactor多線程模型,通常基于在I/O多路復用實現。不同的角色職責有:Dispatcher負責事件分發、Acceptor負責處理客戶端連接、Handler處理非連接事件(例如:讀寫事件)。
一、Reactor單線程模型
1.原理圖示
在Reactor單線程模型中,操作在同一個Reactor線程中完成。根據事件的不同類型,由Dispatcher將事件轉發到不同的角色中處理。連接事件轉發到Acceptor處理、讀寫事件轉發到不同的Handler處理。
原理圖示
2.實現圖示
NIO實現中,可以將Accept事件注冊到select選擇器中,輪詢是否有“接受就緒”事件。如果為“連接就緒”分發給Acceptor角色處理;“寫就緒”事件分發給負責寫的Handler角色處理;“讀就緒”事件分發給負責讀的Handler角色處理。這是事情都在一個線程中處理。
實現圖示
二、Reactor多線程模型
1.原理圖示
在Reactor多線程模型中。根據事件的不同類型,由Dispatcher將事件轉發到不同的角色中處理。連接事件轉發到Acceptor單線程處理、讀寫事件轉發到不同的Handler由線程池處理。
原理圖示
2.實現圖示
NIO實現中,可以將Accept事件注冊到select選擇器中,輪詢是否有“接受就緒”事件。如果為“連接就緒”分發給Acceptor角色處理,此處處理“連接就緒”為一個線程;“寫就緒”事件分發給負責寫的Handler角色由線程池處理;“讀就緒”事件分發給負責讀的Handler角色由線程池處理。
實現圖示
三、主從Reactor多線程模型
1.原理圖示
Reactor多線程模型,由Acceptor接受客戶端連接請求后,創建SocketChannel注冊到Main-Reactor線程池中某個線程的Select中;具體處理讀寫事件還是使用線程池處理(Sub-Reactor線程池)。
原理圖示
2.實現圖示
將Accept事件注冊到select選擇器中輪詢是否有“接受就緒”事件;“連接就緒”分發給Acceptor角色處理,創建新的SocketChannel轉發給Main-Reactor線程池中的某個線程處理;在指定的Main-Reactor某個線程中,將SocketChannel注冊讀寫事件;當“寫就緒/讀就緒”事件分別由線程池(Sub-Reactor線程池)處理。
實現圖示