成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Netty 4.1 源代碼學(xué)習(xí):線程模型

monw3c / 2037人閱讀

摘要:前言本文以自帶的示例工程為例,簡要介紹線程模型示例工程的代碼位于很簡單,僅包含一個(gè)方法用于初始化以及,我們來看看其中和線程模型相關(guān)的一些代碼在的初始化代碼中實(shí)例化了兩個(gè)對(duì)象和,它們有著公共基類,這個(gè)是線程模型的核心類名讓人聯(lián)想到組合模式,

前言

本文以 netty 4.1 自帶的示例工程 netty-example 為例,簡要介紹 netty 線程模型

EchoServer

echo server 示例工程的代碼位于 example/src/main/java/io.netty.example/echo

EchoClient

EchoClientHandler

EchoServer

EchoServerHandler

EchoServer 很簡單,僅包含一個(gè) main 方法用于初始化 netty server 以及 handler,我們來看看其中和線程模型 相關(guān)的一些代碼

// 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 的初始化代碼中實(shí)例化了兩個(gè)對(duì)象 bossGroup 和 workerGroup,它們有著公共基類 EventLoopGroup,這個(gè) EventLoopGroup 是 netty 線程模型的核心

EventLoopGroup 類名讓人聯(lián)想到 "組合模式",所以肯定有個(gè) EventLoop 類,EventLoopGroup 包含一個(gè)或多個(gè) EventLoop

變量名 bossGroup 和 workerGroup 讓人聯(lián)想到 "生產(chǎn)者消費(fèi)者" 模型,即由 bossGroup 產(chǎn)生消息(事件),然后交給 workerGroup 消費(fèi)。此外我們注意到 bossGroup 和 workerGroup 使用了不同的構(gòu)造方法,bossGroup 指定了線程個(gè)數(shù) 1,workerGroup 則沒有,為了發(fā)揮硬件性能,一般會(huì)根據(jù)服務(wù)器 CPU 核心個(gè)數(shù)來設(shè)定 "工作者" 線程個(gè)數(shù),我們跟蹤空構(gòu)造函數(shù),最終會(huì)在父類 MultithreadEventExecutorGroup 中找到當(dāng)未指定線程個(gè)數(shù)時(shí)(nThreads)netty 會(huì)根據(jù) 系統(tǒng)屬性 io.netty.eventLoopThreads 和 CPU 核心數(shù)來確定合適的值

// 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 通常使用兩個(gè) EventLoopGroup,一個(gè)用于生產(chǎn)一個(gè)用于消費(fèi),那么這兩個(gè) EventLoopGroup 是怎么相互通信(耦合)的呢?

總結(jié)

netty 使用 EventLoopGroup 類封裝線程池

netty 通常使用兩個(gè)EventLoopGroup,boss group 和 worker group

boss group 用于網(wǎng)絡(luò) IO,包括接收客戶端連接,讀寫 socket 等,boss group 通常使用基于 NIO 的事件循環(huán)

worker group 用于處理 boss group 讀取的數(shù)據(jù),或者說通常包含應(yīng)用自身的業(yè)務(wù)邏輯

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66535.html

相關(guān)文章

  • Netty 框架總結(jié)「ChannelHandler 及 EventLoop」

    摘要:隨著狀態(tài)發(fā)生變化,相應(yīng)的產(chǎn)生。這些被轉(zhuǎn)發(fā)到中的來采取相應(yīng)的操作。當(dāng)收到數(shù)據(jù)或相關(guān)的狀態(tài)改變時(shí),這些方法被調(diào)用,這些方法和的生命周期密切相關(guān)。主要由一系列組成的。采用的線程模型,在同一個(gè)線程的中處理所有發(fā)生的事。 「博客搬家」 原地址: 簡書 原發(fā)表時(shí)間: 2017-05-05 學(xué)習(xí)了一段時(shí)間的 Netty,將重點(diǎn)與學(xué)習(xí)心得總結(jié)如下,本文主要總結(jié)ChannelHandler 及 E...

    VioletJack 評(píng)論0 收藏0
  • 徹底理解Netty,這一篇文章就夠了

    摘要:如果什么事都沒得做,它也不會(huì)死循環(huán),它會(huì)將線程休眠起來,直到下一個(gè)事件來了再繼續(xù)干活,這樣的一個(gè)線程稱之為線程。而請(qǐng)求處理邏輯既可以使用單獨(dú)的線程池進(jìn)行處理,也可以跟放在讀寫線程一塊處理。 Netty到底是什么 從HTTP說起 有了Netty,你可以實(shí)現(xiàn)自己的HTTP服務(wù)器,F(xiàn)TP服務(wù)器,UDP服務(wù)器,RPC服務(wù)器,WebSocket服務(wù)器,Redis的Proxy服務(wù)器,MySQL的P...

    yy13818512006 評(píng)論0 收藏0
  • Netty3文檔翻譯(二)

    摘要:豐富的緩存數(shù)據(jù)結(jié)構(gòu)使用它自己的緩存來表示字節(jié)序列而不是的。針對(duì)有一個(gè)定義良好的事件模型。有一些協(xié)議是多層的建立在其他低級(jí)協(xié)議基礎(chǔ)上。此外,甚至不是完全線程安全的。協(xié)議由標(biāo)準(zhǔn)化為。協(xié)議緩存整合是一個(gè)高效二進(jìn)制協(xié)議的快速實(shí)現(xiàn)。 Chapter 2、結(jié)構(gòu)概覽 這一節(jié)我們將確認(rèn)Netty提供的核心功能是什么,以及它們?cè)趺礃?gòu)成一個(gè)完整的網(wǎng)絡(luò)應(yīng)用開發(fā)堆棧。 1、豐富的緩存數(shù)據(jù)結(jié)構(gòu) Netty使用它...

    Zhuxy 評(píng)論0 收藏0
  • Netty學(xué)習(xí)NioEventLoop

    摘要:主從模型主從多線程多個(gè)的線程池用于接受客戶端的連接。負(fù)責(zé)多路分離已連接的,讀寫網(wǎng)絡(luò)數(shù)據(jù),將業(yè)務(wù)處理功能扔給線程池完成。比如在線程內(nèi)部進(jìn)行串行操作,避免多線程競(jìng)爭造成的性能問題。 歡迎關(guān)注公眾號(hào):【愛編程】如果有需要后臺(tái)回復(fù)2019贈(zèng)送1T的學(xué)習(xí)資料哦??! showImg(https://upload-images.jianshu.io/upload_images/13150128-3c...

    tulayang 評(píng)論0 收藏0
  • 少啰嗦!一分鐘帶你讀懂Java的NIO和經(jīng)典IO的區(qū)別

    摘要:的選擇器允許單個(gè)線程監(jiān)視多個(gè)輸入通道。一旦執(zhí)行的線程已經(jīng)超過讀取代碼中的某個(gè)數(shù)據(jù)片段,該線程就不會(huì)在數(shù)據(jù)中向后移動(dòng)通常不會(huì)。 1、引言 很多初涉網(wǎng)絡(luò)編程的程序員,在研究Java NIO(即異步IO)和經(jīng)典IO(也就是常說的阻塞式IO)的API時(shí),很快就會(huì)發(fā)現(xiàn)一個(gè)問題:我什么時(shí)候應(yīng)該使用經(jīng)典IO,什么時(shí)候應(yīng)該使用NIO? 在本文中,將嘗試用簡明扼要的文字,闡明Java NIO和經(jīng)典IO之...

    Meils 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<