1. 基本概念
- BIO:一個(gè)連接一個(gè)線程,客戶端有連接請求時(shí)服務(wù)器端就需要啟動(dòng)一個(gè)線程進(jìn)行處理。線程開銷大。
- 偽異步 IO:將請求連接放入線程池,一對(duì)多,但線程還是很寶貴的資源。
- NIO:一個(gè)請求一個(gè)線程,但客戶端發(fā)送的連接請求都會(huì)注冊到多路復(fù)用器上,多路復(fù)用器輪詢到連接有 I/O 請求時(shí)才啟動(dòng)一個(gè)線程進(jìn)行處理。
- AIO:一個(gè)有效請求一個(gè)線程,客戶端的 I/O 請求都是由 OS 先完成了再通知服務(wù)器應(yīng)用去啟動(dòng)線程進(jìn)行處理。
2. 常規(guī)區(qū)別
- BIO是面向流的,NIO是面向緩沖區(qū)的;
- BIO的各種流是阻塞的。
- 而 NIO是非阻塞的;
- BIO的Stream是單向的,而NIO的channel是雙向的。
NIO的特點(diǎn):事件驅(qū)動(dòng)模型、單線程處理多任務(wù)、非阻塞I/O,I/O讀寫不再阻塞,而是返回0、基于block的傳輸比基于流的傳輸更高效、更高級(jí)的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)用事件對(duì)應(yīng)的處理器、事件處理器完成實(shí)際的讀操作,處理讀到的數(shù)據(jù),注冊新的事件,然后返還控制權(quán)。