1,Java NIO ?
Java non-blocking IO?即 非阻塞IO,線程在等待的時候,可以做其他的事情。
?
2,IO?對比NIO
IO?是面向流,NIO?是面向緩沖
面向流是指每次從流中讀出一個或者多個字節,直到全部讀出為止
面向緩沖區是指將數據先存到一個緩存區
?
IO 是阻塞, NIO 是非阻塞
IO:?當線程調用read() 或者write()?的時候,只有當數據被讀取或者完全寫入,否則該線程在此期間干不了其他事情。
NIO: 一個線程向通道發送請求讀取數據開始,直到數據變的可以讀取之前,線程不會阻塞,可以一直做其他事情。
?
3,IO 與 NIO 的選擇
每次發送少量數據,但是需要建立多個通道的情況,例如聊天室,這種情況適合用NIO
大量數據,少量連接,這種情況適合用IO
?
4,NIO有三個核心模塊:Selector(選擇器)、Channel(通道)、Buffer(緩沖區);
?
Buffer:與Channel 進行交互時,需要將數據從Channel 讀取到Buffer,從Buffer 寫入到Channel,緩沖區本質上是一塊可以存取數據的內存,只是被包裝成了NIO? Buffer 對象,提供一些方法,可以訪問。
緩沖區基本類型:ByteBuffer;CharBuffer;ShortBuffer;IntBuffer;LongBuffer;FloatBuffer;DoubleBuffer;
?
Channel: Channel好比IO 流的模擬,任何數據read() 或者write(),都必須通過Channel對象。
?
Selector:NIO 用select 機制,不用為每一個客戶端連接新的線程處理,而是將其注冊到Selector 對象中,這樣單線程利用Selector 對象管理大量的并發的網絡連接。
當有讀寫或時間發生時候,可以從Selector對象中獲得一個SelectorKey 通過這個SelectorKey 可以找到具體的Channel 來獲取從客戶端傳過來的數據。
通道和緩沖區的機制,使得線程無需阻塞地等待IO事件的就緒,但是總是要有人來監管這些IO事件。這個工作就交給了selector來完成,這就是所謂的同步。
要使用Selector,得向Selector注冊Channel,然后調用它的select()方法。這個方法會一直阻塞到某個注冊的通道有事件就緒,這就是所說的輪詢。一旦這個方法返回,線程就可以處理這些事件。
??? Selector中注冊的感興趣事件有:
-
OP_ACCEPT:即連接事件(TCP 連接), 對應于SelectionKey.OP_CONNECT;
-
OP_CONNECT :即確認事件, 對應于SelectionKey.OP_ACCEPT;
-
OP_READ :即讀事件, 對應于SelectionKey.OP_READ, 表示 buffer 可讀.
-
OP_WRITE:即寫事件, 對應于SelectionKey.OP_WRITE, 表示 buffer 可寫.
?