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