[java八股文][Java基礎面試篇]I/O

Java怎么實現網絡IO高并發編程?

可以用 Java NIO ,是一種同步非阻塞的I/O模型,也是I/O多路復用的基礎。

傳統的BIO里面socket.read(),如果TCP RecvBuffer里沒有數據,函數會一直阻塞,直到收到數據,返回讀到的數據, 如果使用BIO要想要并發處理多個客戶端的i/o,那么會使用多線程模式,一個線程專門處理一個客戶端 io,這種模式隨著客戶端越來越多,所需要創建的線程也越來越多,會急劇消耗系統的性能。

image-20240820112641716

NIO 是基于I/O多路復用實現的,它可以只用一個線程處理多個客戶端I/O,如果你需要同時管理成千上萬的連接,但是每個連接只發送少量數據,例如一個聊天服務器,用NIO實現會更好一些。

image-20240820112656259

BIO、NIO、AIO區別是什么?

  • BIO(blocking IO):就是傳統的 java.io 包,它是基于流模型實現的,交互的方式是同步、阻塞方式,也就是說在讀入輸入流或者輸出流時,在讀寫動作完成之前,線程會一直阻塞在那里,它們之間的調用是可靠的線性順序。優點是代碼比較簡單、直觀;缺點是 IO 的效率和擴展性很低,容易成為應用性能瓶頸。
  • NIO(non-blocking IO) :Java 1.4 引入的 java.nio 包,提供了 Channel、Selector、Buffer 等新的抽象,可以構建多路復用的、同步非阻塞 IO 程序,同時提供了更接近操作系統底層高性能的數據操作方式。
  • AIO(Asynchronous IO) :是 Java 1.7 之后引入的包,是 NIO 的升級版本,提供了異步非堵塞的 IO 操作方式,所以人們叫它 AIO(Asynchronous IO),異步 IO 是基于事件和回調機制實現的,也就是應用操作之后會直接返回,不會堵塞在那里,當后臺處理完成,操作系統會通知相應的線程進行后續的操作。

NIO是怎么實現的?

NIO是一種同步非阻塞的IO模型,所以也可以叫NON-BLOCKINGIO。同步是指線程不斷輪詢IO事件是否就緒,非阻塞是指線程在等待IO的時候,可以同時做其他任務。

同步的核心就Selector(I/O多路復用),Selector代替了線程本身輪詢IO事件,避免了阻塞同時減少了不必要的線程消耗;非阻塞的核心就是通道和緩沖區,當IO事件就緒時,可以通過寫到緩沖區,保證IO的成功,而無需線程阻塞式地等待。

NIO由一個專門的線程處理所有IO事件,并負責分發。事件驅動機制,事件到來的時候觸發操作,不需要阻塞的監視事件。線程之間通過wait,notify通信,減少線程切換。

NIO主要有三大核心部分:Channel(通道),Buffer(緩沖區), Selector。傳統IO基于字節流和字符流進行操作,而NIO基于Channel和Buffer(緩沖區)進行操作,數據總是從通道讀取到緩沖區中,或者從緩沖區寫入到通道中。

Selector(選擇區)用于監聽多個通道的事件(比如:連接打開,數據到達)。因此,單個線程可以監聽多個數據通道。

img

你知道有哪個框架用到NIO了嗎?

Netty。

Netty 的 I/O 模型是基于非阻塞 I/O 實現的,底層依賴的是 NIO 框架的多路復用器 Selector。采用 epoll 模式后,只需要一個線程負責 Selector 的輪詢。當有數據處于就緒狀態后,需要一個事件分發器(Event Dispather),它負責將讀寫事件分發給對應的讀寫事件處理器(Event Handler)。事件分發器有兩種設計模式:Reactor 和 Proactor,Reactor 采用同步 I/O, Proactor 采用異步 I/O。

img

Reactor 實現相對簡單,適合處理耗時短的場景,對于耗時長的 I/O 操作容易造成阻塞。Proactor 性能更高,但是實現邏輯非常復雜,適合圖片或視頻流分析服務器,目前主流的事件驅動模型還是依賴 select 或 epoll 來實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77959.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77959.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77959.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python常用的第三方模塊之【jieba庫】支持三種分詞模式:精確模式、全模式和搜索引擎模式(提高召回率)

Jieba 是一個流行的中文分詞Python庫,它提供了三種分詞模式:精確模式、全模式和搜索引擎模式。精確模式嘗試將句子最精確地切分,適合文本分析;全模式則掃描文本中所有可能的詞語,速度快但存在冗余;搜索引擎…

QT6 源(37):界面組件的總基類 QWidget 的源碼閱讀(下,c++ 代碼部分)

(1) QT 在 c 的基礎上增加了自己的編譯器,以支持元對象系統和 UI 界面設計,有 MOC 、 UIC 等 QT 自己的編譯器。本節的源代碼里,為了減少篇幅,易于閱讀,去除了上篇中的屬性部分, 上篇…

rabbitmq-spring-boot-start版本優化升級

文章目錄 1.前言2.優化升級內容3.依賴4.使用4.1發送消息代碼示例4.2消費監聽代碼示例4.3 brock中的消息 5.RabbmitMq的MessageConverter消息轉換器5.1默認行為5.2JDK 序列化的缺點5.3使用 JSON 進行序列化 6.總結 1.前言 由于之前手寫了一個好用的rabbitmq-spring-boot-start啟…

git lfs下載大文件限額

起因是用 model.load_state_dict(torch.load())加載pt權重文件時,出現錯誤:_pickle.UnpicklingError: invalid load key, ‘v’. GPT告訴我:你的 pt 文件不是權重文件,而是模型整體保存(或根本不是 PyTorch 文件&#…

什么是RAG?RAG的主要流程是什么?

**RAG(Retrieval-Augmented Generation)**是一種結合檢索與生成技術的框架,旨在通過引入外部知識增強生成模型的性能。其核心思想是:在生成文本時,先從外部知識庫中檢索相關信息,再將檢索結果與原始輸入結合,作為生成模型的輸入,從而提升生成內容的準確性、相關性和信息…

【Rust 精進之路之第13篇-生命周期·進階】省略規則與靜態生命周期 (`‘static`)

系列: Rust 精進之路:構建可靠、高效軟件的底層邏輯 作者: 碼覺客 發布日期: 2025年4月20日 引言:讓編譯器“讀懂”你的意圖——省略的藝術 在上一篇【生命周期入門】中,我們理解了生命周期的必要性——它是 Rust 編譯器用來確保引用有效性、防止懸垂引用的關鍵機制。我…

Python爬蟲實戰:獲取xie程網敦煌酒店數據并分析,為51出行做參考

一、引言 伴隨互聯網的飛速發展,在線旅游平臺成為人們出行預訂酒店的重要途徑。xie程網作為國內頗具知名度的在線旅游平臺,存有豐富的酒店信息。借助爬取xie程網的酒店數據并加以深入分析,能夠為用戶提供更為精準的酒店推薦,特別是在旅游旺季,如 51 出行期間。本研究致力…

第二十一講 XGBoost 回歸建模 + SHAP 可解釋性分析(利用R語言內置數據集)

下面我將使用 R 語言內置的 mtcars 數據集,模擬一個完整的 XGBoost 回歸建模 SHAP 可解釋性分析 實戰流程。我們將以預測汽車的油耗(mpg)為目標變量,構建 XGBoost 模型,并用 SHAP 來解釋模型輸出。 🚗 示例…

PyMC+AI提示詞貝葉斯項目反應IRT理論Rasch分析籃球比賽官方數據:球員能力與位置層級結構研究

全文鏈接:tecdat.cn/?p41666 在體育數據分析領域不斷發展的當下,數據科學家們致力于挖掘數據背后的深層價值,為各行業提供更具洞察力的決策依據。近期,我們團隊完成了一項極具意義的咨詢項目,旨在通過先進的數據分析手…

【android bluetooth 框架分析 03】【Bta 層詳解 1】【Bluetooth Application Laye 介紹】

藍牙協議棧中 Bluetooth Application Layer(藍牙應用層)是協議棧核心組成部分,它位于協議棧中間偏上的位置,主要負責將底層 Bluetooth Stack(如 L2CAP、AVDTP、RFCOMM、SDP 等)與上層 Profile 和 Android F…

單片機獲取真實時間的實現方法

單片機獲取真實時間(即當前的年月日、時分秒等)通常需要依賴外部時間源或模塊,因為單片機本身沒有內置的實時時鐘(RTC)功能。 在 C 語言環境下,單片機獲取真實時間通常需要依賴 外部硬件模塊(如…

Linux——進程優先級/切換/調度

1.進程優先級 1.進程優先級是什么:進程獲取CPU資源的先后順序 2.為什么要有進程優先級:因為一般CPU只有一塊,資源短缺,所以就需要優先級來確定誰先誰后的問題 3.值越低 進程的優先級越高 ps -l進行查看 UID:user id …

鑄鐵劃線平板:多行業的精密測量工具(北重十字滑臺加工廠家)

鑄鐵劃線平板是一種用于精密測量和校準的工具,廣泛應用于各個行業。它通常由鑄鐵制成,表面經過精密加工,能夠保證較高的平整度和準確度。鑄鐵劃線平板的主要作用是用來檢驗工件的平整度和垂直度,也常用于劃線、校準和測量工件的平…

Excel/WPS表格中圖片鏈接轉換成對應的實際圖片

Excel 超鏈圖變助手(點擊下載可免費試用) 是一款將鏈接轉換成實際圖片,批量下載表格中所有圖片的轉換工具,無需安裝,雙擊打開即可使用。 表格中鏈接如下圖所示: 操作方法: 1、雙擊以下圖標&a…

STM32---串口通信USART

目錄 一、串口通信協議 二、USART模塊介紹 (1)移位寄存器 (2)控制電路 (3)波特率 (4)C語言接口 三、串口的引腳初始化 (1)引腳分布表 &…

流程架構是什么?為什么要構建流程架構,以及如何構建流程結構?

本文從:流程架構是什么?為什么要構建流程架構?如何構建流程結構三個方面來介紹。 一、首先,我們來了解流程架構是什么? 流程架構是人體的骨架,是大樓的砌筑,是課本的目錄,是流程管理…

網絡結構及安全科普

文章目錄 終端聯網網絡硬件基礎網絡協議示例:用戶訪問網頁 OSI七層模型網絡攻擊(Hack)網絡攻擊的主要類別(一)按攻擊目標分類(二)按攻擊技術分類 網絡安全防御 典型攻擊案例相關名詞介紹網絡連接…

同z科技面經

同z科技-2025-4-23 1.自我介紹 個人信息 校園經歷 實習經歷 項目經歷 個人技能掌握 目前學習技術 2.封裝緩存工具類怎么封裝的 先介紹使用緩存的問題 解決的邏輯 封裝的邏輯 應用 緩存穿透: 緩存雪崩: 緩存擊穿: https://www…

基于LoRA的Llama 2二次預訓練實踐:高效低成本的大模型領域適配

引言 近年來,大語言模型(LLM)如Meta的Llama 2系列憑借其強大的生成和理解能力成為NLP領域的核心工具。然而,直接將通用預訓練模型應用于垂直領域(如醫療、法律、金融)時,常面臨領域知識不足的問…

Python爬蟲(2)Python爬蟲入門:從HTTP協議解析到豆瓣電影數據抓取實戰

目錄 一、背景與需求?二、 Web基礎與HTTP協議核心解析?2.1 HTTP協議:數據交互的基石?2.2 為何爬蟲需理解HTTP協議?? 三、 Python爬蟲實戰:Requests庫核心用法?3.1 安裝與環境配置?3.2 案例1:GET請求抓取豆瓣電影Top250?3.3…