1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Netty-NIO線程模型

        共 5985字,需瀏覽 12分鐘

         ·

        2021-05-14 12:25

        點擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”

        優(yōu)質(zhì)文章,第一時間送達(dá)

        IO模型基本說明

        IO模型簡單的理解:就是用什么樣的通道進行數(shù)據(jù)的發(fā)送和接收,很大程度上決定了程序通信的性能。

        目前為止java共支持3種網(wǎng)絡(luò)編程模型:BIO,NIO,AIO:

        BIO:

        同步并阻塞,服務(wù)器實現(xiàn)模式為一個連接一個線程,即客戶端有連接請求時服務(wù)器端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當(dāng)然可以通過線程池機制改善。

        線程模型圖

        代碼實例

        /**
         * @Author qrn
         * @Date 2021/5/9 下午9:20
         * @Version 1.0
         * @blog https://blog.csdn.net/qq_41971087
         * 實現(xiàn)一個簡單的http服務(wù):
         */
        public class HttpServiceTest {

            public static void main(String[] args) throws IOException{
              //創(chuàng)建一個 ServerSocket 綁定8801端口
                ServerSocket serverSocket = new ServerSocket(8801);
                while (true){
                    try{
                        Socket socket = serverSocket.accept();
                        service(socket);
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                }
            }

          //模擬HTTP報文,輸出hell,nio到瀏覽器
            private static void service(Socket socket){
                try{
                    PrintWriter printWriter  = new PrintWriter(socket.getOutputStream(),true);
                    printWriter.println("HTTP/1.1 200 OK");
                    printWriter.println("Content-Type:text/html;charset=utf-8");
                    String body = "hello,nio";
                    printWriter.println("Content-Length:" + body.getBytes().length);
                    printWriter.println();
                    printWriter.write(body);
                    printWriter.close();
                    socket.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }


        服務(wù)器通信原理

        業(yè)務(wù)場景:

        BIO方式適用于連接數(shù)目比較小且固定的架構(gòu),這種方式對服務(wù)器資源要求比較高,并發(fā)局限于應(yīng)用中,JDK1.4以前的唯一選擇,但程序直觀簡單易理解。

        NIO:

        1.同步非阻塞,服務(wù)器實現(xiàn)模式為一個請求一個線程,即客戶端發(fā)送的連接請求都會注冊到多路復(fù)用器上,

        多路復(fù)用器輪詢到連接有I/O請求時才啟動一個線程進行處理。

        2.使用較少的線程便可以處理許多連接,因此也減少了內(nèi)存管理和上下文切換所帶來開銷;

        3.當(dāng)沒有 I/O 操作需要處理的時候,線程也可以被用于其他任務(wù)。

        線程模型圖

        核心組件:

        Selector:

        選擇器,是 Java 的非阻塞 I/O 實現(xiàn)的關(guān)鍵。它使用了事件通知 API 以確定在一組非阻塞套接字中有哪些已經(jīng)就緒能夠進 行 I/O 相關(guān)的操作

        Channe:

        通道,可以同時進行讀寫,而流只能讀或者只能寫,通道可以實現(xiàn)異步讀寫數(shù)據(jù),通道可以從緩沖讀數(shù)據(jù),也可以寫數(shù)據(jù)到緩沖

        通道的目的是確保多線程訪問的安全。

        Buffer:

        緩沖區(qū)本質(zhì)是一個可以讀寫數(shù)據(jù)的內(nèi)存塊,‘可以理解為是一個容器對象(數(shù)組)

        在nio中,Buffer是一個頂層抽像類。

        public final Buffer flip() {
                limit = position;
                position = 0;
                mark = -1;
                return this;
            }


        flip 讀寫轉(zhuǎn)換,通過position 屬性來達(dá)到下標(biāo)的切換實現(xiàn),當(dāng)我們調(diào)用get 方法從Buffer中讀取數(shù)據(jù)的時候,position都是加1,一直到

        與limit 相等的時候就結(jié)束。

        代碼實例:

        Buffer代碼小實例:

        /**
         * @Author qrn
         * @Date 2021/5/5 下午9:43
         * @Version 1.0
         * @blog https://blog.csdn.net/qq_41971087
         */
        public class BasicBuffer {
            public static void main(String[] args) {

                /**
                 * 創(chuàng)建一個buff 大小為5
                 */
                IntBuffer allocate = IntBuffer.allocate(5);

                for(int i=0;i<allocate.capacity();i++){
                    allocate.put(i*2);
                }
                //讀寫轉(zhuǎn)換
                allocate.flip();

                //循環(huán)打印buff的值
                while (allocate.hasRemaining()){
                    System.out.println(allocate.get());
                }
            }
        }

        業(yè)務(wù)場景:

        NIO方式適用于連接數(shù)目多且連接比較短(輕操作)的架構(gòu),比如聊天服務(wù)器,并發(fā)局限于應(yīng)用中,編程比較復(fù)雜,JDK1.4開始支持

        AIO:

        異步非阻塞,服務(wù)器實現(xiàn)模式為一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務(wù)器應(yīng)用去啟動線程進行處理。

        描述

        異步非阻塞 I/O 模型是一種處理與 I/O 重疊進行的模型。讀請求會立即返回,說明 read 請求已經(jīng)成功發(fā)起了。在后臺完成讀操作時,應(yīng)用程序然后會執(zhí)行其他處理操作。當(dāng) read 的響應(yīng)到達(dá)時,就會產(chǎn)生一個信號或執(zhí)行一個基于線程的回調(diào)函數(shù)來完成這次 I/O 處理過程。

        在一個進程中為了執(zhí)行多個 I/O 請求而對計算操作和 I/O 處理進行重疊處理的能力利用了處理速度與 I/O 速度之間的差異。當(dāng)一個或多個 I/O 請求掛起時,CPU 可以執(zhí)行其他任務(wù);或者更為常見的是,在發(fā)起其他 I/O 的同時對已經(jīng)完成的 I/O 進行操作。

        業(yè)務(wù)場景:

        AIO方式使用于連接數(shù)目多且連接比較長(重操作)的架構(gòu),比如相冊服務(wù)器,充分調(diào)用OS參與并發(fā)操作,編程比較復(fù)雜,JDK7開始支持。





        版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。

        本文鏈接:

        https://blog.csdn.net/qq_41971087/article/details/116572886







        粉絲福利:Java從入門到入土學(xué)習(xí)路線圖

        ??????

        ??長按上方微信二維碼 2 秒


        感謝點贊支持下哈 

        瀏覽 35
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            麻花传剧mv无痕免费观看苏语棠 | 综合偷拍第一页 | 国产淫秽视频在线观看 | 激情动态视频 | 亚洲图片第一页 | 亚洲特黄av成人无码 | 夜夜躁精品AAAAXXXX | 女人无遮挡一级毛片 | 99精品在线观看 | 美女张开腿让我了一夜 |