Java開發中Netty執行緒模型原理解析!
Java開發中Netty執行緒模型原理解析,Netty是Java領域有名的開源網路庫具有高效能和高擴充套件性的特點,很多流行的框架都是基於它來構建。Netty 執行緒模型不是一成不變的,取決於使用者的啟動引數配置。透過設定不同的啟動引數Netty ,可同時支援 Reactor 單執行緒模型、多執行緒模型。
Netty執行緒模型就是Reactor模式的實現,如圖:
一、執行緒組
Netty抽象了兩組執行緒池BossGroup和WorkerGroup,其型別都是NioEventLoopGroup,BossGroup用來接受客戶端發來的連線WorkerGroup則負責對完成TCP三次握手的連線進行處理。
NioEventLoopGroup裡面包含了多個NioEventLoop管理NioEventLoop的生命週期。每個NioEventLoop中包含了一個NIO Selector、一個佇列、一個執行緒;其中執行緒用來做輪詢註冊到Selector上的Channel的讀寫事件和對投遞到佇列裡面的事件進行處理。
Boss NioEventLoop執行緒的執行步驟:
(1)處理accept事件與client建立連線, 生成NioSocketChannel。
(2)將NioSocketChannel註冊到某個worker NIOEventLoop上的selector
(3)處理任務佇列的任務 即runAllTasks。
Worker NioEventLoop執行緒的執行步驟:
(1)輪詢註冊到自己Selector上的所有NioSocketChannel的read和write事件。
(2)2處理read和write事件在對應NioSocketChannel處理業務。
(3)#runAllTasks處理任務佇列TaskQueue的任務,一些耗時的業務處理可以放入TaskQueue中慢慢處理這樣不影響資料在pipeline中的流動處理。
Worker NIOEventLoop處理NioSocketChannel業務時,使用了pipeline (管道),管道中維護了handler處理器連結串列用來處理channel中的資料。
二、ChannelPipeline
Netty將Channel的資料管道抽象為ChannelPipeline,訊息在ChannelPipline中流動和傳遞。ChannelPipeline持有I/O事件攔截器ChannelHandler的雙向連結串列,由ChannelHandler對I/O事件進行攔截和處理,可以方便的新增和刪除ChannelHandler來實現不同的業務邏輯定製不需要對已有的ChannelHandler進行修改能夠實現對修改封閉和對擴充套件的支援。
ChannelPipeline是一系列的ChannelHandler例項,流經一個Channel的入站和出站事件可以被ChannelPipeline 攔截。每當一個新的Channel被建立了,都會建立一個新的ChannelPipeline並繫結到該Channel上,這個關聯是永久性的;Channel既不能附上另一個ChannelPipeline也不能分離當前這個。這些都由Netty負責完成,而無需開發人員的特別處理。
根據起源一個事件將由ChannelInboundHandler或ChannelOutboundHandler處理,ChannelHandlerContext實現轉發或傳播到下一個ChannelHandler。一個ChannelHandler處理程式可以通知ChannelPipeline中的下一個ChannelHandler執行。Read事件(入站事件)和write事件(出站事件)使用相同的pipeline,入站事件會從連結串列head 往後傳遞到最後一個入站的handler出站事件會從連結串列tail往前傳遞到最前一個出站的 handler,兩種型別的 handler 互不干擾。
ChannelInboundHandler回撥方法:
ChannelOutboundHandler回撥方法:
三、非同步非阻塞
寫操作:透過NioSocketChannel的write方法向連線裡面寫入資料時候是非阻塞的,馬上會返回即使呼叫寫入的執行緒是我們的業務執行緒。Netty透過在ChannelPipeline中判斷呼叫NioSocketChannel的write的呼叫執行緒是不是其對應的NioEventLoop中的執行緒,如果發現不是則會把寫入請求封裝為WriteTask投遞到其對應的NioEventLoop中的佇列裡面,然後等其對應的NioEventLoop中的執行緒輪詢讀寫事件時候,將其從佇列裡面取出來執行。
讀操作:當從NioSocketChannel中讀取資料時候並不是需要業務執行緒阻塞等待,而是等NioEventLoop中的IO輪詢執行緒發現Selector上有資料就緒時,透過事件通知方式來通知業務資料已就緒,可以來讀取並處理了。
每個NioSocketChannel對應的讀寫事件都是在其對應的NioEventLoop管理的單執行緒內執行,對同一個NioSocketChannel不存在併發讀寫,所以無需加鎖處理。
使用Netty框架進行網路通訊時,當我們發起I/O請求後會馬上返回,而不會阻塞我們的業務呼叫執行緒;如果想要獲取請求的響應結果,也不需要業務呼叫執行緒使用阻塞的方式來等待,而是當響應結果出來的時候,使用I/O執行緒非同步通知業務的方式,所以在整個請求 -> 響應過程中業務執行緒不會由於阻塞等待而不能幹其他事情。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31548651/viewspace-2779676/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Netty原始碼解析一——執行緒池模型之執行緒池NioEventLoopGroupNetty原始碼執行緒模型OOP
- 淺談Netty的執行緒模型Netty執行緒模型
- Java併發(四)----執行緒執行原理Java執行緒
- Reactor執行緒模型及其在Netty中的應用React執行緒模型Netty
- Java併發包中執行緒池ThreadPoolExecutor原理探究Java執行緒thread
- Netty 框架學習 —— EventLoop 和執行緒模型Netty框架OOP執行緒模型
- Java執行緒池二:執行緒池原理Java執行緒
- java多執行緒原理Java執行緒
- java併發筆記之java執行緒模型Java筆記執行緒模型
- 深入Netty邏輯架構,從Reactor執行緒模型開始Netty架構React執行緒模型
- 執行緒池執行模型原始碼全解析執行緒模型原始碼
- Java併發/多執行緒-CAS原理分析Java執行緒
- Netty原始碼死磕一(netty執行緒模型及EventLoop機制)Netty原始碼執行緒模型OOP
- Java 執行緒同步原理探析Java執行緒
- java多執行緒:執行緒池原理、阻塞佇列Java執行緒佇列
- Netty中的執行緒處理EventLoopNetty執行緒OOP
- 在netty3.x中存在兩種執行緒:boss執行緒和worker執行緒。Netty執行緒
- Netty原始碼分析之Reactor執行緒模型詳解Netty原始碼React執行緒模型
- 多執行緒下載原理解析執行緒
- 深入原始碼,深度解析Java 執行緒池的實現原理原始碼Java執行緒
- Java 執行緒記憶體模型Java執行緒記憶體模型
- 從原始碼的角度解析執行緒池執行原理原始碼執行緒
- Java執行緒篇——執行緒的開啟Java執行緒
- 圖解Java執行緒池原理圖解Java執行緒
- Java執行緒池原理及分析Java執行緒
- Java執行緒池核心原理剖析Java執行緒
- 【多執行緒與高併發原理篇:3_java記憶體模型】執行緒Java記憶體模型
- Netty、MINA、Twisted一起學系列10:執行緒模型Netty執行緒模型
- Netty是什麼,Netty為什麼速度這麼快,執行緒模型分析Netty執行緒模型
- SpringBoot執行緒池和Java執行緒池的實現原理Spring Boot執行緒Java
- Java多執行緒-完成Android開發中的某些需求Java執行緒Android
- Redis執行緒模型的原理分析蒼癘Redis執行緒模型
- Java中的執行緒Java執行緒
- 執行緒模型執行緒模型
- Java多執行緒記憶體模型Java執行緒記憶體模型
- Java執行緒池ThreadPoolExecutor原始碼解析Java執行緒thread原始碼
- Java原始碼解析 ThreadPoolExecutor 執行緒池Java原始碼thread執行緒
- Java原始碼解析 - ThreadPoolExecutor 執行緒池Java原始碼thread執行緒