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由三個主要的部分組成:
緩衝區(Buffers)、通道(Channels)和非阻塞I/O的核心類組成。
NIO自己是基於事件驅動思想來完成的,其主要想解決的是BIO的大併發問題:
在使用同步I/O的網絡應用中,若是要同時處理多個客戶端請求,或是在客戶端要同時和多個服務器進行通信,就必須使用多線程來處理。
也就是說,將每個客戶端請求分配給一個線程來單獨處理。
這樣作雖然能夠達到咱們的要求,但同時又會帶來另一個問題:
因爲每建立一個線程,就要爲這個線程分配必定的內存空間(也叫工做存儲器),並且操做系統自己也對線程的總數有必定的限制。
若是客戶端的請求過多,服務端程序可能會由於不堪重負而拒絕客戶端的請求,甚至服務器可能會所以而癱瘓。
NIO(同步非阻塞):
服務器實現模式爲一個請求一個線程,
即客戶端發送的鏈接請求都會註冊到多路複用器上,多路複用器輪詢到鏈接有I/O請求時才啓動一個線程進行處理。
AIO(異步非阻塞)
與NIO不一樣,當進行讀寫操做時,只須直接調用API的read或write方法便可。
這兩種方法均爲異步的:
對於讀操做而言,當有流可讀取時,操做系統會將可讀的流傳入read方法的緩衝區,並通知應用程序
對於寫操做而言,當操做系統將write方法傳遞的流寫入完畢時,操做系統主動通知應用程序。
便可以理解爲,read/write方法都是異步的,完成後會主動調用回調函數。