準備好了再通知我:網絡NIO

java NIO是NEW IO的簡稱,它是一種能夠替代javaIO的一套新的IO機制。它提供了一套不一樣java標準IO的操做機制。嚴格來講,NIO與併發並沒有直接關係。可是,使用NIO能夠大大提升線程的使用效率。
java NIO中涉及的基礎內容有通道和緩衝區、文件IO和網絡IO。
對於標註的網絡IO來講,咱們會使用socket進行網絡的讀寫。爲了讓服務器能夠支持更多的客戶端鏈接,一般的作法是爲每一個客戶端鏈接開啓一個線程。
要了解NIO,咱們首先要知道在NIO中的一個關鍵組建Channel(通道)。Channel有點相似於流,一個Channel能夠和文件或者網絡Socket對應,若是Channel對應着一個Socket,那麼往這個Channel中寫數據,就等同於向Socket中寫入數據。
另一個與Channel密切相關的Selector,在Channel的衆多實現中,有一個SelectortableChannel實現,表示可被選擇的通道。任何一個SelectableChannel均可以將本身註冊到一個Selector中,這樣,這個Channel就能被Selector所管理。而一個Selector能夠管理多個SelectableChannel。當SelectableChannel的數據準備好時,Selector就會接到通知,獲得那些已經準備好的數據。而SocketChannel就是SelectableChannel的一種。
一個Selector能夠由一個線程進行管理,而一個SocketChannel則能夠表示一個客戶端鏈接,所以就構成由一個或者極少數線程,來處理大量客戶端鏈接的結構。當與客戶端鏈接的數據沒有準備好時,Selector會處於等待狀態(不過幸虧,用於管理Selector的線程數是極少許的),而一旦有任何一個SocketChannel準備好了數據,Selector就能當即獲得通知,獲取數據進行處理。
相關文章
相關標籤/搜索