淺談Java中BIO、NIO、AIO的概念

首先從線程的角度來區分,BIO、NIO、AIO之間可以這麼區分:

BIO,同步阻塞式IO,簡單理解:一個連接一個線程
NIO,同步非阻塞IO,簡單理解:一個請求一個線程
AIO,異步非阻塞IO,簡單理解:一個有效請求一個線程


詳細來講:

BIO

在JDK1.4之前,用Java編寫網絡請求,都是建立一個ServerSocket,然後,客戶端建立Socket時就會詢問是否有線程可以處理,如果沒有,要麼等待,要麼被拒絕。即:一個連接,要求Server對應一個處理線程。

NIO

在Java裏的由來,在JDK1.4及以後版本中提供了一套API來專門操作非阻塞I/O,我們可以在java.nio包及其子包中找到相關的類和接口。由於這套API是JDK新提供的I/O API,因此,也叫New I/O,這就是包名nio的由來。這套API由三個主要的部分組成:緩衝區(Buffers)、通道(Channels)和非阻塞I/O的核心類組成。在理解NIO的時候,需要區分,說的是New I/O還是非阻塞IO,New I/O是Java的包,NIO是非阻塞IO概念。這裏講的是後面一種。
NIO本身是基於事件驅動思想來完成的,其主要想解決的是BIO的大併發問題: 在使用同步I/O的網絡應用中,如果要同時處理多個客戶端請求,或是在客戶端要同時和多個服務器進行通訊,就必須使用多線程來處理。也就是說,將每一個客戶端請求分配給一個線程來單獨處理。這樣做雖然可以達到我們的要求,但同時又會帶來另外一個問題。由於每創建一個線程,就要爲這個線程分配一定的內存空間(也叫工作存儲器),而且操作系統本身也對線程的總數有一定的限制。如果客戶端的請求過多,服務端程序可能會因爲不堪重負而拒絕客戶端的請求,甚至服務器可能會因此而癱瘓。
NIO基於Reactor,當socket有流可讀或可寫入socket時,操作系統會相應的通知引用程序進行處理,應用再將流讀取到緩衝區或寫入操作系統。 

也就是說,這個時候,已經不是一個連接就要對應一個處理線程了,而是有效的請求,對應一個線程,當連接沒有數據時,是沒有工作線程來處理的。

AIO

與NIO不同,當進行讀寫操作時,只須直接調用API的read或write方法即可。這兩種方法均爲異步的,對於讀操作而言,當有流可讀取時,操作系統會將可讀的流傳入read方法的緩衝區,並通知應用程序;對於寫操作而言,當操作系統將write方法傳遞的流寫入完畢時,操作系統主動通知應用程序。 

即可以理解爲,read/write方法都是異步的,完成後會主動調用回調函數。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章