假設有這麼一個場景,有一排水壺(客戶)在燒水。 java
AIO的作法是,每一個水壺上裝一個開關,當水開了之後會提醒對應的線程去處理。
NIO的作法是,叫一個線程不停的循環觀察每個水壺,根據每一個水壺當前的狀態去處理。
BIO的作法是,叫一個線程停留在一個水壺那,直到這個水壺燒開,纔去處理下一個水壺。react
java.NIO包裏包括三個基本的組件緩存
l buffer:由於NIO是基於緩衝的,因此buffer是最底層的必要類,這也是IO和NIO的根本不一樣,雖然stream等有buffer開頭的擴展類,但只是流的包裝類,仍是從流讀到緩衝區,而NIO倒是直接讀到buffer中進行操做。網絡
由於讀取的都是字節,因此在操做文字時,要用charset類進行編解碼操做。架構
2 channel:相似於IO的stream,可是不一樣的是除了FileChannel,其餘的channel都能以非阻塞狀態運行。FileChannel執行的是文件的操做,能夠直接DMA操做內存而不依賴於CPU。其餘好比socketchannel就能夠在數據準備好時才進行調用。IO分爲磁盤IO和網絡IO,因此一般意義上的NIO是指網絡IO,即除FileChnnel以外的channel均可以非阻塞socket
3 selector:用於分發請求到不一樣的channel,這樣才能確保channel不處於阻塞狀態就能夠收發消息性能
AIO:
爲何netty不使用AIO,而使用NIO優化