NIO是一種同步非阻塞IO, 基于Reactor模型來實現的。其實相當于就是一個線程處理大量的客戶端的請求,通過一個線程輪詢大量的channel,每次就獲取一批有事件的channel,然后對每個請求啟動一個線程處理即可。這里的核心就是非阻塞,就那個selector一個線程就可以不停輪詢channel,所有客戶端請求都不會阻塞,直接就會進來,大不了就是等待一下排著隊而已。這里面優化BIO的核心就是,一個客戶端并不是時時刻刻都有數據進行交互,沒有必要死耗著一個線程不放,所以客戶端選擇了讓線程歇一歇,只有客戶端有相應的操作的時候才發起通知,創建一個線程來處理請求。
NIO模式下,系統調用read,如果發現沒數據已經到達,就會立刻返回-1。使用輪詢的方式,不斷的嘗試有沒有數據到達。沒有得到數據就等一小會再試繼續輪詢。
NIO解決了線程阻塞的問題 ,但是會帶來兩個新問題:
- 如果有IO連接都要檢查,那么就得一個一個的read。這會帶來大量的線程上下文切換(read是系統調用,每調用一次就得在用戶態和核心態切換一次)
- 輪詢的休息等待時間無法確定。這里是要猜多久之后數據才能到。等待時間設的太長,程序響應延遲就過大;設的太短,就會造成過于頻繁的重試,干耗CPU而已。