日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java开发中Netty线程模型原理解析!

發布時間:2024/9/30 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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線程異步通知業務的方式,所以在整個請求 -> 響應過程中業務線程不會由于阻塞等待而不能干其他事情。

本文來自千鋒教育,轉載請注明出處。

總結

以上是生活随笔為你收集整理的Java开发中Netty线程模型原理解析!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。