<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Netty-NIO線程模型

          共 5985字,需瀏覽 12分鐘

           ·

          2021-05-14 12:25

          點擊上方藍色字體,選擇“標星公眾號”

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

          IO模型基本說明

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

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

          BIO:

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

          線程模型圖

          代碼實例

          /**
           * @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.當沒有 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 屬性來達到下標的切換實現(xiàn),當我們調(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í)行其他處理操作。當 read 的響應(yīng)到達時,就會產(chǎn)生一個信號或執(zhí)行一個基于線程的回調(diào)函數(shù)來完成這次 I/O 處理過程。

          在一個進程中為了執(zhí)行多個 I/O 請求而對計算操作和 I/O 處理進行重疊處理的能力利用了處理速度與 I/O 速度之間的差異。當一個或多個 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從入門到入土學習路線圖

          ??????

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


          感謝點贊支持下哈 

          瀏覽 35
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  精品人妻一区二区三区蜜桃 | 五月天丁香色婷婷 | 欧美第一页 | 亚洲无码十八禁 | 久久伊人在 |