傳統的 IO 流都是阻塞式的。也就是說,當一個線程調用 read() 或 write()時,該線程被阻塞,直到有一些資料被讀取或寫入,該線程在此期間不能執行其他任務。是以,在完成網絡通信進行 IO操作時,由于線程會阻塞,是以伺服器端必須為每個用戶端都提供一個獨立的線程進行處理,當伺服器端需要處理大量用戶端時,性能急劇下降。
Java NIO 是非阻塞模式的。當線程從某通道進行讀寫資料時,若沒有資料可用時,該線程可以進行其他任務。線程通常将非阻塞 IO 的空閑時間用于在其他通道上執行 IO 操作,是以單獨的線程可以管理多個輸入和輸出通道。是以,NIO 可以讓伺服器端使用一個或有限幾個線程來同時處理連接配接到伺服器端的所有用戶端。
選擇器(Selector)
選擇器(Selector) 是 SelectableChannle 對象的多路複用器,Selector 可以同時監控多個 SelectableChannel 的 IO 狀況,也就是說,利用 Selector可使一個單獨的線程管理多個 Channel。Selector 是非阻塞 IO 的核心。
SelectableChannle 的結構如下圖:

阻塞式IO流操作示例:
非阻塞式IO流
一、使用 NIO 完成網絡通信的三個核心:
1. 通道(Channel):負責連接配接
java.nio.channels.Channel 接口:
|--SelectableChannel
|--SocketChannel
|--ServerSocketChannel
|--DatagramChannel
|--Pipe.SinkChannel
|--Pipe.SourceChannel
2. 緩沖區(Buffer):負責資料的存取
3. 選擇器(Selector):是 SelectableChannel 的多路複用器。用于監控 SelectableChannel 的 IO 狀況