NIO 中的 ServerSocketChannel 相當於普通 IO 中的 ServerSocket,而客戶端的 SocketChannel 則相當於普通 IO 中的 Socket。
如果我們直接從 Channel 中讀取數據時,很可能會有問題,因為這時 Channel 中可能根本就沒有數據可以讀,而強行進行讀取的話,會使線程掛起一直等待著數據的到來,直到有數據到達才被喚醒,那該線程在數據到達這段時間內將不做任何事情。
通過 Selector 來檢查 Channel 的狀態變化,當具體的狀態滿足條件時向外發出通知即可,就跟監聽器一樣,我們將 Channel 註冊到 Selector 上,然後告訴 Selector 我這個 Channel 所感興趣的事件列表,接下來 Selector 就會負責把滿足條件的事件通知到 Channel,這樣的話 Channel 就不需要每次傻傻的來讀取數據了。
那 Channel 怎樣才能知道他感興趣的事件已經發生了呢,當 Channel 把自己感興趣的事件註冊到 Selector 上之後,只需要通過 Selector 提供的 select 方法去查詢就好了。