1. 基本概念
BIO:一個連接一個線程,客戶端有連接請求時服務器端就需要啟動一個線程進行處理。線程開銷大。
偽異步 IO:將請求連接放入線程池,一對多,但線程還是很寶貴的資源。
NIO:一個請求一個線程,但客戶端發送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有 I/O 請求時才啟動一個線程進行處理。
AIO:一個有效請求一個線程,客戶端的 I/O 請求都是由 OS 先完成了再通知服務器應用去啟動線程進行處理。
2. 常規區別
BIO 是面向流的,NIO 是面向緩沖區的;
BIO 的各種流是阻塞的。
而 NIO 是非阻塞的;
BIO 的 Stream 是單向的,而 NIO 的 channel 是雙向的。
NIO 的特點:事件驅動模型、單線程處理多任務、非阻塞 I/O,I/O 讀寫不再阻塞,而是返回 0、基于 block 的傳輸比基于流的傳輸更高效、更高級的 IO 函數 zero-copy、IO 多路復用大大提高了 Java 網絡應用的可伸縮性和實用性?;?Reactor 線程模型。
在 Reactor 模式中,事件分發器等待某個事件或者可應用或個操作的狀態發生,事件分發器就把這個事件傳給事先注冊的事件處理函數或者回調函數,由后者來做實際的讀寫操作。如在 Reactor 中實現讀:注冊讀就緒事件和相應的事件處理器、事件分發器等待事件、事件到來,激活分發器,分發器調用事件對應的處理器、事件處理器完成實際的讀操作,處理讀到的數據,注冊新的事件,然后返還控制權。