Java中網(wǎng)絡(luò)IO的實(shí)現(xiàn)方式(BIO、NIO、AIO)介紹
在網(wǎng)絡(luò)編程中,接觸到最多的就是利用Socket進(jìn)行網(wǎng)絡(luò)通信開發(fā)。在Java中主要是以下三種實(shí)現(xiàn)方式BIO、NIO、AIO。
關(guān)于這三個(gè)概念的辨析以前一直都是好像懂,但是表達(dá)的不是很清楚,下面做個(gè)總結(jié)完全辨析清楚。
1. BIO方式
首先我用一個(gè)較為通俗的語言來說明:
BIO 就是阻塞IO,每個(gè)TCP連接進(jìn)來服務(wù)端都需要?jiǎng)?chuàng)建一個(gè)線程來建立連接并進(jìn)行消息的處理。如果中間發(fā)生了阻塞(比如建立連接、讀數(shù)據(jù)、寫數(shù)據(jù)時(shí)發(fā)生阻礙),線程也會(huì)發(fā)生阻塞,并發(fā)情況下,N個(gè)連接需要N個(gè)線程來處理。
這種方式的缺點(diǎn)就是:并發(fā)情況下效率很低。
下面用一個(gè)圖示來說明BIO的工作情況

2. NIO方式
NIO是JDK1.4提出的,還是先用一段通俗的話來說明NIO的工作原理:
NIO 也就是非阻塞IO,是基于事件驅(qū)動(dòng)的思想(Reactor線程模型)。對(duì)比與BIO來說,NIO使用一個(gè)線程來管理所有的Socket 通道,也就是基于Selector機(jī)制,當(dāng)查詢到事件時(shí)(連接、接受連接、讀、寫),就會(huì)轉(zhuǎn)發(fā)給不同的處理線程(handler)。
下面給出Reactor模型的工作應(yīng)用圖:

3. AIO方式
AIO是JDK1.7提出的,也就是異步IO。AIO采用的是Proactor模式。我們首先應(yīng)該辨析的是AIO和NIO的區(qū)別:
(1)NIO的通知是發(fā)生在Handler之前;
(2)AIO的通知是發(fā)生在讀寫等處理之后的回調(diào),有通知時(shí)表示相關(guān)操作已經(jīng)結(jié)束了。
AIO在進(jìn)行讀寫操作時(shí),只需要調(diào)用相應(yīng)的read/write方法,并傳入CompletionHandler(動(dòng)作完成時(shí)處理器),在動(dòng)作完成后會(huì)調(diào)用CompletionHandler。 NIO的通知是發(fā)生在動(dòng)作之前,是在可讀可寫的時(shí)候,Selector發(fā)現(xiàn)了這些事件后就通知并調(diào)用Handler處理,
下面給出Proactor模式的工作流程圖:

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
IDEA不識(shí)別Java文件:文件變橙色&顯示后綴名.java的解決
這篇文章主要介紹了IDEA不識(shí)別Java文件:文件變橙色&顯示后綴名.java的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Java實(shí)現(xiàn)inputstream流的復(fù)制代碼實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)inputstream流的復(fù)制代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
Java文件斷點(diǎn)續(xù)傳實(shí)現(xiàn)原理解析
這篇文章主要介紹了Java文件斷點(diǎn)續(xù)傳實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
SpringBoot整合WebSocket實(shí)現(xiàn)實(shí)時(shí)通信功能
在當(dāng)今互聯(lián)網(wǎng)時(shí)代,實(shí)時(shí)通信已經(jīng)成為了許多應(yīng)用程序的基本需求,而WebSocket作為一種全雙工通信協(xié)議,為開發(fā)者提供了一種簡單、高效的實(shí)時(shí)通信解決方案,本文將介紹如何使用SpringBoot框架來實(shí)現(xiàn)WebSocket的集成,快速搭建實(shí)時(shí)通信功能,感興趣的朋友可以參考下2023-11-11
springBoot項(xiàng)目打包idea的多種方法
這篇文章主要介紹了springBoot項(xiàng)目打包idea的多種方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
基于java Springboot實(shí)現(xiàn)教務(wù)管理系統(tǒng)詳解
這篇文章主要介紹了Java 實(shí)現(xiàn)簡易教務(wù)管理系統(tǒng)的代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
SpringBoot中application.properties與application.yml區(qū)別小結(jié)
本文主要介紹了SpringBoot中application.properties與application.yml區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10
JDK8通過Stream 對(duì)List,Map操作和互轉(zhuǎn)的實(shí)現(xiàn)
這篇文章主要介紹了JDK8通過Stream 對(duì)List,Map操作和互轉(zhuǎn)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

