關於java流的幾個概念:IO、BIO、NIO、AIO,有幾個人全知道?

weixin_34391445發表於2017-08-13


5954965-3cf73a619489c333

關於同步、阻塞的知識我之前的文章有介紹,所以關於流用到這些概念與之前多執行緒用的概念一樣。

下面具體來看看java中的幾種流

IO/BIO

BIO就是指IO,即傳統的Blocking IO,即同步並阻塞的IO。這也是jdk1.4之前的唯一選擇,依賴於ServerSocket實現,即一個請求對應一個執行緒,如果執行緒數不夠連線則會等待空餘執行緒或者拒絕連線。所以用這種方式,在高併發情況下效率是很低的,也不可靠,一般只應用於連線數比較小且固定架構的應用,但api也比較容易使用。

NIO

新的IO,即New IO或者Non-Blocking IO,即同步不阻塞的IO。jdk1.4之後提供了一系列的方法來操作流,定義在java.nio包下面。相比於傳統的BIO,NIO 提供了高速的面向快的I/O,它加入了Buffer、Channel、Selector等概念。它是基於事件驅動的,採用了Reactor模式,它使用一個執行緒管理所有的socket通道,即客戶端傳送的連線請求都會註冊到多路複用器上,多路複用器輪詢到連線有I/O請求時才啟動一個執行緒進行處理。它的特點是要不斷主動地去詢問資料有沒有處理完,一般只適用於連線數目較大但連線時間短的應用,如聊天應用等。

AIO

新的IO2.0,即NIO2.0,jdk1.7開始應用,叫做非同步不阻塞的IO。AIO引入異常通道的概念,採用了Proactor模式,簡化了程式編寫,一個有效的請求才啟動一個執行緒,它的特點是先由作業系統完成後才通知服務端程式啟動執行緒去處理,一般適用於連線數較多且連線時間長的應用。

幾種IO的綜合對比:

BIONIOAIO

客戶端:執行緒數1:1M:1M:0

阻塞型別阻塞非阻塞非阻塞

同步型別同步同步非同步

程式設計難度簡單非常複雜複雜

除錯難度簡單複雜複雜

可靠性非常差高高

吞吐量低高高

java提供的NIO的api使用比較複雜,一般建議使用像netty這樣的框架,而不要使用jdk自帶的api。

5954965-20f8cc71f336c18c

相關文章