面經·Java·(B)IO/NIO/AIO
Java中高手加QQ群498238384 備註:Java中高手- 呢稱
如果對您有幫助,麻煩在右邊點個贊哦~~
- 什麼是IO、NIO、AIO?
- 講一講Channel 和 Buffer
- 講一講selector
- directBuffer和buffer的區別
- 什麼是IO、NIO、AIO?
-
NIO 指新IO,核心是非阻塞,解決傳統IO的阻塞問題。操作物件是Buffer
-
其實NIO的核心是IO執行緒池,一定要記住這個關鍵點。
-
NIO中的IO多路複用呼叫系統級別的select和poll模型,由系統進行監控IO狀態,避免使用者執行緒通過反覆嘗試的方式查詢狀態
-
-
AIO即Asynchronous I/O(非同步非阻塞 I/O),這是Java 1.7引入的NIO 2.0中用到的。
-
- 講一講Channel
-
一個Channel(通道)代表和某一實體的連線,這個實體可以是檔案、網路套接字等。既可以讀又可以寫。而流是單向的。
-
- 講一講selector
-
Selector 為Channel服務,Channel為要訪問的資料服務。
-
selector採集各個channel的狀態(或者說監聽事件:
- Accept:有可以接受的連線
- Connect:連線成功
- Read:有資料可讀
- Write:可以寫入資料了
-
程式設計師通過將通道註冊到選擇器,並設定好關心的事件,然後就可以通過呼叫select()方法,靜靜地等待事件發生。 避免了反覆主動嘗試Read()、write()、accept()、connnect()操作。
作用舉例:避免因為沒有資料到達而反覆嘗試read().(耗費CPU)。
-
為什麼要用selector,類似於為什麼要select的問題
-
前文說了,如果用阻塞I/O,需要多執行緒(浪費記憶體),如果用非阻塞I/O,需要不斷重試(耗費CPU)。Selector的出現解決了這尷尬的問題,非阻塞模式下,通過Selector,我們的執行緒只為已就緒的通道工作(約等於已準備好的資料),不用盲目的重試了。比如,當所有通道都沒有資料到達時,也就沒有Read事件發生,我們的執行緒會在select()方法處被掛起,從而讓出了CPU資源。
-
-
-
Buffer
-
Buffer是緩衝區,不像傳統IO中那樣直接使用byte陣列,它是封裝過的。
-
(注意:將Buffer資料 寫入 通道是通道 讀取 操作,從通道 讀取 資料到Buffer是Buffer 寫入 操作)
-
與Java基本型別相對應,NIO提供了多種 Buffer 型別,如ByteBuffer、CharBuffer、IntBuffer等,區別就是讀寫緩衝區時的單位長度不一樣(以對應型別的變數為單位進行讀寫)。
Buffer中有3個很重要的變數,它們是理解Buffer工作機制的關鍵,分別是
- capacity (總容量)
- position (指標當前位置)
- limit (讀/寫邊界位置)
-
- directBuffer和buffer的區別