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

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

下面具體來看看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的綜合對比:

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

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


分享到:


相關文章: