IO和NIO
1、主要區別:
io是面向流、阻塞的。 Nio是面向緩存、非阻塞的。
傳統IO基于字節流和字符流進行操作。
NIO基于Channel(通道)、Buffer(緩沖區)進行操作,數據從通道讀取到緩沖區中,或者從緩沖區讀取到通道中。
NIO中使用Selector(選擇區)監聽多個Channel(通道)事件,因此單個線程可以監聽多個數據通道。(比如:連接打開,數據到達)
2、IO 工作流程:
由于Java IO是阻塞的,所以當面對多個流的讀寫時需要多個線程處理。例如在網絡IO中,Server端使用一個線程監聽一個端口,一旦某個連接被accept,創建新的線程來處理新建立的連接。其中 read/write 是阻塞的。
3、NIO 工作流程:
NIO 提供 Selector 實現單個線程管理多個channel的功能。select 調用可能是阻塞的,也可以是非阻塞的。但是read/write是非阻塞的!
4、NIO為什么會被阻塞:
//這個方法可能會阻塞,直到有一個已注冊的事件發生,或者當一個或者更多的事件發生時
//可以設置超時時間,防止進程阻塞
selector.select(long timeout);//使用此方法可以防止阻塞,阻塞在select()方法上的線程也可以立刻返回,不阻塞
selector.selectNow();//可以喚醒阻塞狀態下的selector
selector.wakeup();
5、BIO、NIO、AIO 有什么區別:
BIO:Block IO 同步阻塞式 IO,就是我們平常使用的傳統 IO,它的特點是模式簡單使用方 便,并發處理能力低。
NIO:New IO 同步非阻塞 IO,是傳統 IO 的升級,客戶端和服務器端通過 Channel(通道) 通訊,實現了多路復用。
AIO:Asynchronous IO 是 NIO 的升級,也叫 NIO2,實現了異步非堵塞 IO ,異步 IO 的 操作基于事件和回調機制。
總結
- 上一篇: 阿里内部mysql规范40条
- 下一篇: sleep 与 wait 区别