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中實現讀:注冊讀就緒事件和相應的事件處理器、事件分發器等待事件、事件到來,激活分發器,分發器調用事件對應的處理器、事件處理器完成實際的讀操作,處理讀到的數據,注冊新的事件,然后返還控制權。