• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Netty框架基礎----NIO非阻塞式IO介紹,示意圖和demo實例

    標簽: Netty

    一.NIO介紹


    • Java NIO 全稱 java non-blocking IO,是指 JDK 從 JDK1.4 開始提供的新 API。Java 提供了一系列改進的輸入/輸出的新特性,被統稱為 NIO(即 New IO),是同步非阻塞的

    • NIO 相關類都被放在 java.nio 包及子包下,并且對原 java.io 包中的很多類進行改寫
      在這里插入圖片描述

    • NIO 有三大核心部分:Channel(通道),Buffer(緩沖區), Selector(選擇器)

    NIO是 面向緩沖區 ,或者面向 塊 編程的。數據讀取到一個它稍后處理的緩沖區,需要時可在緩沖區中前后移動,這就增加了處理過程中的靈活性,使用它可以提供非阻塞式的高伸縮性網絡。滿足我們在高并發環境下的生產需求。


    二.NIO和BIO比較

    • BIO 以流的方式處理數據,而 NIO 以塊的方式處理數據,塊 I/O 的效率比流 I/O 高很多
    • BIO 是阻塞的,NIO 則是非阻塞的
    • BIO基于字節流和字符流進行操作,而 NIO 基于 Channel(通道)和 Buffer(緩沖區)進行操作,數據總是從通道讀取到緩沖區中,或者從緩沖區寫入到通道中。Selector(選擇器)用于監聽多個通道的事件(比如:連接請求,數據到達等),因此使用單個線程就可以監聽多個客戶端通道

    三.NIO三大核心的原理示意圖

    在這里插入圖片描述

    1. 每個channel 都會對應一個Buffer
    2. Selector 對應一個線程, 一個線程對應多個channel(連接)
    3. 程序切換到哪個channel 是由事件Event決定的, Event 是一個重要的概念。Selector 會根據不同的事件,在各個通道上切換
    4. 數據的讀取寫入是通過Buffer, 這個和BIO , BIO 中要么是輸入流,或者是 輸出流, 不能雙向,但是NIO的Buffer 是可以讀也可以寫, 需要 flip 方法切換

    緩沖區(Buffer)

    • 緩沖區(Buffer):緩沖區本質上是一個可以讀寫數據的內存塊,可以理解成是一個容器對象(含數組),該對象提供了一組方法,可以更輕松地使用內存塊,緩沖區對象內置了一些機制,能夠跟蹤和記錄緩沖區的狀態變化情況。Channel 提供從文件、網絡讀取數據的渠道,但是讀取或寫入的數據都必須經由 Buffer
      在這里插入圖片描述
    Buffer頂層抽象類的重要變量

    所有繼承Buffer的子類都有這四個參數
    在這里插入圖片描述

    Buffer基本函數用法示例

    put:寫數據
    get:讀數據
    flip():讀寫切換
    position(int i):定位buffer

    public static void main(String[] args) {
    
            //創建一個Buffer, 大小為 5, 即可以存放5個int
            IntBuffer intBuffer = IntBuffer.allocate(5);
    
            //向buffer 存放數據 存放了 0 2 4 6 8
            for(int i = 0; i < intBuffer.capacity(); i++) {
                intBuffer.put( i * 2);
            }
    
            //將buffer轉換,讀寫切換(!!!)
            intBuffer.flip();//將buffer的讀寫狀態切換 從寫--->讀
            intBuffer.position(1);//position函數能定位buffer的索引位置 設置為1則索引為1 對應的數字是2
            System.out.println(intBuffer.get());//輸出2
            
            intBuffer.limit(3);
            while (intBuffer.hasRemaining()) {
                System.out.println(intBuffer.get());
            }
        }
    

    通道(Channel)

    NIO的通道類似于流,但有些區別如下:

    • 通道可以同時進行讀寫,而流只能讀或者只能寫
    • 通道可以實現異步讀寫數據
    • 通道可以從緩沖讀數據,也可以寫數據到緩沖
      在這里插入圖片描述

    Channel在NIO中是一個接口

    public interface Channel extends AttributeMap, ChannelOutboundInvoker, Comparable<Channel>
    

    常用的 Channel 類有:FileChannel、DatagramChannel、ServerSocketChannel 和 SocketChannel。【ServerSocketChanne 類似 ServerSocket , SocketChannel 類似 Socket】


    版權聲明:本文為bupttulongming原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/bupttulongming/article/details/103469186

    智能推薦

    JVM底層存儲示意圖

    一、正如我們所知道的,在java中一切事物皆對象,那么讓我們從類開始說起,一開始,我們都會從如下代碼開始: 但是底層究竟是怎么運轉的,初學者都會很迷茫,我也是如此,后來在學習的時候,才漸漸明白,其實所謂的類和對象,就是一個東西,只不過這個玩意兒,很特別,在你編碼的時候,所謂的class就是一個邏輯模型,專門讓程序員看的,在運行的時候就會變成物理結構,占用實際的內存空間,做真實的事情。 列表內容我很...

    結構及配置示意圖

    結構示意圖 pom.xml web.xml index.html signin.js index.js dashboard.js bootstarp.min.js  ...

    HDFS SecondaryNameNode CheckPoint流程示意圖

    為什么需要CheckPoint? NN和2NN工作機制: 思考:NameNode中的元數據是存儲在哪里的? 首先,我們做個假設,如果存儲在NameNode節點的磁盤中,因為經常需要進行隨機訪問,還有響應客戶請求,必然是效率過低。因此,元數據需要存放在內存中。但如果只存在內存中,一旦斷電,元數據丟失,整個集群就無法工作了。因此產生在磁盤中備份元數據的FsImage。 這樣又會帶來新的問題,當在內存中...

    LaTeX tikz 畫地球示意圖

    畫圖代碼如下: 編譯結果如下: 聲明:以上代碼由 Marco Miani 所寫,未能給出原文鏈接,在此表示歉意,同時感謝 Marco Miani 前輩!...

    css 行高示意圖

    當設置了font-size時,設置行高會有誤差,解決方案:...

    猜你喜歡

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡