1.概述
??I/O
模型簡單的理解:就是用什么樣的通道進(jìn)行數(shù)據(jù)的發(fā)送和接收,很大程度上決定了程序通信的性能。Java
共支持 3
種網(wǎng)絡(luò)編程模型 I/O
模式:BIO
、NIO
、AIO
。
2.Java BIO
??Java BIO(Blocking I/O)
:是傳統(tǒng)的java io 編程,其相關(guān)的類和接口在 java.io。同步并阻塞(傳統(tǒng)阻塞型),服務(wù)器實現(xiàn)模式為一個連接一個線程,即客戶端有連接請求時,服務(wù)器端就需要啟動一個線程進(jìn)行處理,如果這個連接不做任何事情會造成不必要的線程開銷。
對 BIO
編程流程的梳理
- 服務(wù)器端啟動一個
ServerSocket
。 - 客戶端啟動
Socket
對服務(wù)器進(jìn)行通信,默認(rèn)情況下服務(wù)器端需要對每個客戶建立一個線程與之通訊。 - 客戶端發(fā)出請求后,先咨詢服務(wù)器是否有線程響應(yīng),如果沒有則會等待,或者被拒絕。
- 如果有響應(yīng),客戶端線程會等待請求結(jié)束后,在繼續(xù)執(zhí)行。
Java BIO 存在的問題:
- 每個請求都需要創(chuàng)建獨立的線程,與對應(yīng)的客戶端進(jìn)行數(shù)據(jù)Read,業(yè)務(wù)處理,數(shù)據(jù) Write 。
- 當(dāng)并發(fā)數(shù)較大時,需要創(chuàng)建大量線程來處理連接,系統(tǒng)資源占用較大。
- 連接建立后,如果當(dāng)前線程暫時沒有數(shù)據(jù)可讀,則線程就阻塞在 Read 操作上,造成線程資源浪費。
BIO方式適用于連接數(shù)目比較小且固定的架構(gòu),這種方式對服務(wù)器資源要求比較高,并發(fā)局限于應(yīng)用中。
3.Java NIO
??Java NIO(java non-blocking IO)
:同步非阻塞,服務(wù)器實現(xiàn)模式為一個線程處理多個請求(連接),即客戶端發(fā)送的連接請求都會注冊到多路復(fù)用器上,多路復(fù)用器輪詢到連接有 I/O
請求就進(jìn)行處理 。NIO
有三大核心部分: Channel
(通道)、Buffer
(緩沖區(qū))、Selector
(選擇器) 。NIO
是面向緩沖區(qū),或者面向塊編程的。數(shù)據(jù)讀取到一個它稍后處理的緩沖區(qū),需要時可在緩沖區(qū)中前后移動,這就增加了處理過程中的靈活性,使用它可以提供非阻塞式的高伸縮性網(wǎng)絡(luò)。
對于NIO的理解:
- 每個 Channel 對應(yīng)一個 Buffer,底層是一個數(shù)組;
- Selector 對應(yīng)一個線程,一個線程對應(yīng)多個channel,根據(jù)不同的事件,在不同的通道上切換;
- 程序切換到哪個channel 是有事件決定的(accept/read/write);
- 數(shù)據(jù)的讀取寫入是通過Buffer, 這個和BIO , BIO 中要么是輸入流,或者是輸出流, 不能雙向,但是NIO的Buffer 是可以讀也可以寫, 需要 flip 方法切換
4. Java AIO
??JDK7
引入了 AsynchronousI/O
,即 AIO
。在進(jìn)行 I/O
編程中,常用到兩種模式:Reactor
和 Proactor
。Java
的 NIO
就是 Reactor
,當(dāng)有事件觸發(fā)時,服務(wù)器端得到通知,進(jìn)行相應(yīng)的處理。Java AIO(NIO.2)
:異步非阻塞,AIO
引入異步通道的概念,采用了 Proactor
模式,簡化了程序編寫,有效的請求才啟動線程,它的特點是先由操作系統(tǒng)完成后才通知服務(wù)端程序啟動線程去處理,一般適用于連接數(shù)較多且連接時間較長的應(yīng)用。文章來源:http://www.zghlxwxcb.cn/news/detail-858863.html
5. BIO VS NIO VS AIO
編程模型 | BIO | NIO | AIO |
---|---|---|---|
IO模型 | 同步阻塞 | 同步非阻塞(多路復(fù)用) | 異步非阻塞 |
編程難度 | 簡單 | 復(fù)雜 | 復(fù)雜 |
可靠性 | 差 | 好 | 好 |
吞吐量 | 低 | 高 | 高 |
舉例說明文章來源地址http://www.zghlxwxcb.cn/news/detail-858863.html
- 同步阻塞:到理發(fā)店理發(fā),就一直等理發(fā)師,直到輪到自己理發(fā)。
- 同步非阻塞:到理發(fā)店理發(fā),發(fā)現(xiàn)前面有其它人理發(fā),給理發(fā)師說下,先干其他事情,一會過來看是否輪到自己.
理發(fā)店理發(fā),發(fā)現(xiàn)前面有其它人理發(fā),給理發(fā)師說下,先干其他事情,一會過來看是否輪到自己. - 異步非阻塞:給理發(fā)師打電話,讓理發(fā)師上門服務(wù),自己干其它事情,理發(fā)師自己來家給你理發(fā)
到了這里,關(guān)于Java中的BIO、NIO與AIO的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!