摘要:前言本文以自帶的示例工程為例,簡要介紹線程模型示例工程的代碼位于很簡單,僅包含一個方法用于初始化以及,我們來看看其中和線程模型相關的一些代碼在的初始化代碼中實例化了兩個對象和,它們有著公共基類,這個是線程模型的核心類名讓人聯想到組合模式,
前言
本文以 netty 4.1 自帶的示例工程 netty-example 為例,簡要介紹 netty 線程模型
EchoServerecho server 示例工程的代碼位于 example/src/main/java/io.netty.example/echo
EchoClient
EchoClientHandler
EchoServer
EchoServerHandler
EchoServer 很簡單,僅包含一個 main 方法用于初始化 netty server 以及 handler,我們來看看其中和線程模型 相關的一些代碼
// EchoServer.java public static void main(String[] args) throws Exception { ... // Configure the server EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) ... } finally { ... } }EventLoop & EventLoopGroup
在 EchoServer 的初始化代碼中實例化了兩個對象 bossGroup 和 workerGroup,它們有著公共基類 EventLoopGroup,這個 EventLoopGroup 是 netty 線程模型的核心
EventLoopGroup 類名讓人聯想到 "組合模式",所以肯定有個 EventLoop 類,EventLoopGroup 包含一個或多個 EventLoop
變量名 bossGroup 和 workerGroup 讓人聯想到 "生產者消費者" 模型,即由 bossGroup 產生消息(事件),然后交給 workerGroup 消費。此外我們注意到 bossGroup 和 workerGroup 使用了不同的構造方法,bossGroup 指定了線程個數 1,workerGroup 則沒有,為了發揮硬件性能,一般會根據服務器 CPU 核心個數來設定 "工作者" 線程個數,我們跟蹤空構造函數,最終會在父類 MultithreadEventExecutorGroup 中找到當未指定線程個數時(nThreads)netty 會根據 系統屬性 io.netty.eventLoopThreads 和 CPU 核心數來確定合適的值
// MultithreadEventLoopGroup.java public abstract class MultithreadEventLoopGroup extends MultithreadEventExecutorGroup implements EventLoopGroup { private static final int DEFAULT_EVENT_LOOP_THREADS; static { DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt( "io.netty.eventLoopThreads", Runtime.getRuntime().availableProcessors() * 2)); if (logger.isDebugEnabled()) { logger.debug("-Dio.netty.eventLoopThreads: {}", DEFAULT_EVENT_LOOP_THREADS); } } protected MultithreadEventLoopGroup(int nThreads, Executor executor, Object... args) { super(nThreads == 0 ? DEFAULT_EVENT_LOOP_THREADS : nThreads, executor, args); } ... }Channel & EventLoop
上文提到 netty 通常使用兩個 EventLoopGroup,一個用于生產一個用于消費,那么這兩個 EventLoopGroup 是怎么相互通信(耦合)的呢?
總結netty 使用 EventLoopGroup 類封裝線程池
netty 通常使用兩個EventLoopGroup,boss group 和 worker group
boss group 用于網絡 IO,包括接收客戶端連接,讀寫 socket 等,boss group 通常使用基于 NIO 的事件循環
worker group 用于處理 boss group 讀取的數據,或者說通常包含應用自身的業務邏輯
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66535.html
摘要:隨著狀態發生變化,相應的產生。這些被轉發到中的來采取相應的操作。當收到數據或相關的狀態改變時,這些方法被調用,這些方法和的生命周期密切相關。主要由一系列組成的。采用的線程模型,在同一個線程的中處理所有發生的事。 「博客搬家」 原地址: 簡書 原發表時間: 2017-05-05 學習了一段時間的 Netty,將重點與學習心得總結如下,本文主要總結ChannelHandler 及 E...
摘要:如果什么事都沒得做,它也不會死循環,它會將線程休眠起來,直到下一個事件來了再繼續干活,這樣的一個線程稱之為線程。而請求處理邏輯既可以使用單獨的線程池進行處理,也可以跟放在讀寫線程一塊處理。 Netty到底是什么 從HTTP說起 有了Netty,你可以實現自己的HTTP服務器,FTP服務器,UDP服務器,RPC服務器,WebSocket服務器,Redis的Proxy服務器,MySQL的P...
摘要:豐富的緩存數據結構使用它自己的緩存來表示字節序列而不是的。針對有一個定義良好的事件模型。有一些協議是多層的建立在其他低級協議基礎上。此外,甚至不是完全線程安全的。協議由標準化為。協議緩存整合是一個高效二進制協議的快速實現。 Chapter 2、結構概覽 這一節我們將確認Netty提供的核心功能是什么,以及它們怎么構成一個完整的網絡應用開發堆棧。 1、豐富的緩存數據結構 Netty使用它...
摘要:主從模型主從多線程多個的線程池用于接受客戶端的連接。負責多路分離已連接的,讀寫網絡數據,將業務處理功能扔給線程池完成。比如在線程內部進行串行操作,避免多線程競爭造成的性能問題。 歡迎關注公眾號:【愛編程】如果有需要后臺回復2019贈送1T的學習資料哦!! showImg(https://upload-images.jianshu.io/upload_images/13150128-3c...
摘要:的選擇器允許單個線程監視多個輸入通道。一旦執行的線程已經超過讀取代碼中的某個數據片段,該線程就不會在數據中向后移動通常不會。 1、引言 很多初涉網絡編程的程序員,在研究Java NIO(即異步IO)和經典IO(也就是常說的阻塞式IO)的API時,很快就會發現一個問題:我什么時候應該使用經典IO,什么時候應該使用NIO? 在本文中,將嘗試用簡明扼要的文字,闡明Java NIO和經典IO之...
閱讀 2683·2021-09-26 10:19
閱讀 2136·2021-09-24 10:27
閱讀 2520·2021-09-01 10:42
閱讀 2302·2019-08-29 16:09
閱讀 2485·2019-08-29 15:17
閱讀 1447·2019-08-29 15:09
閱讀 633·2019-08-29 11:14
閱讀 2301·2019-08-26 13:25