成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文了解Java的I/O演進之路

開發 前端
在Java的軟件設計開發中,通信架構不可避免,我們在進行不同系統或者不同進程之間的數據交互,或者在高并發下的通信場景下都需要用到網絡通信相關的技術,對于一些經驗豐富的程序員來說,Java早期的網絡通信架構存在一些缺陷,其中最令人惱火的是基于性能低下的同步阻塞式的I/O通信(BIO),隨著互聯網開發下通信性能的高要求,Java在2002年開始支持了非阻塞式的I/O通信技術NIO。

1.  I/O 模型基本說明

I/O 模型:就是用什么樣的通道或者說是通信模式和架構進行數據的傳輸和接收,很大程度上決定了程序通信的性能。 Java 共支持 3 種網絡編程的/IO 模型:

  • BIO
  • NIO
  • AIO

實際通信需求下,要根據不同的業務場景和性能需求決定選擇不同的I/O模型

2. Java BIO

  • Java BIO 就是傳統的java io  編程,其相關的類和接口在 java.io
  • BIO(blocking I/O) : 同步阻塞,服務器實現模式為一個連接一個線程,即客戶端有連接請求時服務器端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,可以通過線程池機制改善(實現多個客戶連接服務器)

圖片圖片

Java BIO 工作機制

BIO  編程流程的梳理

服務器端啟動一個 ServerSocket,注冊端口,調用accpet方法監聽客戶端的Socket連接。

  1. 客戶端啟動 Socket 對服務器進行通信,默認情況下服務器端需要對每個客戶 建立一個線程與之通訊

3. Java NIO

  • Java NIO(New IO)也有人稱之為 java non-blocking IO是從Java 1.4版本開始引入的一個新的IO API,可以替代標準的Java IO API。NIO與原來的IO有同樣的作用和目的,但是使用的方式完全不同,NIO支持面向緩沖區的、基于通道的IO操作。NIO將以更加高效的方式進行文件的讀寫操作。NIO可以理解為非阻塞IO,傳統的IO的read和write只能阻塞執行,線程在讀寫IO期間不能干其他事情,比如調用socket.read()時,如果服務器一直沒有數據傳輸過來,線程就一直阻塞,而NIO中可以配置socket為非阻塞模式。
  • NIO 相關類都被放在 java.nio 包及子包下,并且對原 java.io 包中的很多類進行改寫。
  • NIO 有三大核心部分:Channel( 通道) ,Buffer( 緩沖區), Selector( 選擇器)
  • Java NIO 的非阻塞模式,使一個線程從某通道發送請求或者讀取數據,但是它僅能得到目前可用的數據,如果目前沒有數據可用時,就什么都不會獲取,而不是保持線程阻塞,所以直至數據變的可以讀取之前,該線程可以繼續做其他的事情*。 非阻塞寫也是如此,一個線程請求寫入一些數據到某通道,但不需要等待它完全寫入,這個線程同時可以去做別的事情。
  • 通俗理解:NIO 是可以做到用一個線程來處理多個操作的。假設有 1000 個請求過來,根據實際情況,可以分配20 或者 80個線程來處理。不像之前的阻塞 IO 那樣,非得分配 1000 個

圖片圖片

NIO 三大核心原理示意圖

Buffer緩沖區

緩沖區本質上是一塊可以寫入數據,然后可以從中讀取數據的內存。這塊內存被包裝成NIO Buffer對象,并提供了一組方法,用來方便的訪問該塊內存。相比較直接對數組的操作,Buffer API更加容易操作和管理。

Channel(通道)

Java NIO的通道類似流,但又有些不同:既可以從通道中讀取數據,又可以寫數據到通道。但流的(input或output)讀寫通常是單向的。 通道可以非阻塞讀取和寫入通道,通道可以支持讀取或寫入緩沖區,也支持異步地讀寫。

Selector選擇器

Selector是 一個Java NIO組件,可以能夠檢查一個或多個 NIO 通道,并確定哪些通道已經準備好進行讀取或寫入。這樣,一個單獨的線程可以管理多個channel,從而管理多個網絡連接,提高效率

圖片圖片

  • 每個 channel 都會對應一個 Buffer
  • 一個線程對應Selector , 一個Selector對應多個 channel(連接)
  • 程序切換到哪個 channel 是由事件決定
  • Selector 會根據不同的事件,在各個通道上切換
  • Buffer 就是一個內存塊 , 底層是一個數組
  • 數據的讀取寫入是通過 Buffer完成的 , BIO 中要么是輸入流,或者是輸出流, 不能雙向,但是 NIO 的 Buffer 是可以讀也可以寫。
  • Java NIO系統的核心在于通道(Channel)和緩沖區 (Buffer)。通道表示打開到 IO 設備(例如:文件、 套接字)的連接。若需要使用 NIO 系統,需要獲取 用于連接 IO 設備的通道以及用于容納數據的緩沖 區。然后操作緩沖區,對數據進行處理。簡而言之,Channel 負責傳輸, Buffer 負責存取數據

Java AIO

Java AIO(NIO.2): 異步非阻塞,服務器實現模式為一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啟動線程進行處理,一般適用于連接數較多且連接時間較長的應用

與NIO不同,當進行讀寫操作時,只須直接調用API的read或write方法即可, 這兩種方法均為異步的,對于讀操作而言,當有流可讀取時,操作系統會將可讀的流傳入read方法的緩沖區,對于寫操作而言,當操作系統將write方法傳遞的流寫入完畢時,操作系統主動通知應用程序

BIO、NIO、AIO 適用場景分析

  • BIO 方式適用于連接數目比較小且固定的架構,這種方式對服務器資源要求比較高,并發局限于應用中,JDK1.4以前的唯一選擇,但程序簡單易理解。
  • NIO 方式適用于連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,彈幕系統,服務器間通訊等。 編程比較復雜,JDK1.4 開始支持。
  • AIO 方式使用于連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用 OS 參與并發操作, 編程比較復雜,JDK7 開始支持。
責任編輯:武曉燕 來源: springboot葵花寶典
相關推薦

2025-03-07 10:14:03

2020-08-27 07:34:50

Zookeeper數據結構

2018-10-08 15:22:36

IO模型

2024-02-01 11:57:31

this指針代碼C++

2021-08-30 19:04:29

jsIO

2023-04-26 15:43:24

容器編排容器編排工具

2023-11-20 08:18:49

Netty服務器

2023-11-08 08:21:52

MVPMVVMMVI

2023-12-26 07:33:45

Redis持久化COW

2022-10-28 13:48:24

Notebook數據開發機器學習

2022-02-25 07:34:36

MQTT協議RabbitMQ

2022-06-08 08:11:56

威脅建模網絡安全網絡攻擊

2025-05-23 09:38:54

JWT開發Go

2023-11-06 08:16:19

APM系統運維

2022-11-11 19:09:13

架構

2023-11-21 08:37:09

2025-03-28 09:56:55

2024-01-19 11:53:29

文件系統操作系統存儲

2023-10-27 08:15:45

2022-02-24 07:34:10

SSL協議加密
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 性高湖久久久久久久久 | 久久精品一区 | 在线观看成人小视频 | 视频一区在线 | 精品国产精品国产偷麻豆 | 久久久av| 久久久久久久久久久久久9999 | 国产九一精品 | 欧美国产日韩在线观看成人 | 99热播放 | 国产一区二区三区在线视频 | 美女中文字幕视频 | 国产农村一级国产农村 | 色综合天天网 | 中文字幕一区二区三区在线观看 | 久久久久久久一区 | 日韩久久久久久久 | 亚洲成人综合在线 | 欧美在线观看一区二区 | 黄色大片视频 | 91精品国产一区二区三区 | 欧美视频| 欧美xxxⅹ性欧美大片 | 国产麻豆一区二区三区 | 精品美女 | 日韩av美女电影 | 日本午夜网 | 成人无遮挡毛片免费看 | 一二区成人影院电影网 | 亚洲激情综合 | 一区二区三区国产 | 国产欧美一区二区在线观看 | 天天玩天天干天天操 | 日本视频在线播放 | 黄色毛片免费看 | 国产精品一区二区欧美 | 久久精品a | 亚洲精品乱码久久久久久按摩观 | 二区精品| 久久久国产一区二区三区 | 日韩免费av一区二区 |