Java review--NIO

ZeroWM發表於2016-08-01


  NIO其實很簡單,核心元件就三個:通道(Channels), 緩衝區(Buffers),Selectors(選擇器)。


Selector和Channel

要使用Selector,得向Selector檢測多個NIO通道,並註冊Channel,然後呼叫它的select()方法。這個方法會一直阻塞到某個註冊的通道有事件就緒。一旦這個方法返回,執行緒就可以處理這些事件,事件的例子有如新連線進來,資料接收等.




簡述實現就是:

1.建立
Selector selector = Selector.open();

2.註冊通道(FileChannel不可以,因為它只能是阻塞模式)
channel.configureBlocking(false);//channel處於非阻塞模式
SelectionKey key = channel.register(selector,Selectionkey.OP_READ);

3.可以監聽的事件
connect /accept/read/write

4.Selector註冊Channel時,register()方法會返回一個SelectionKey物件

selectionKey.isAcceptable();
selectionKey.isConnectable();
selectionKey.isReadable();
selectionKey.isWritable();



Buffers使用

1.Buffer寫入資料,記錄條數
2.讀取資料,通過flip()方法將Buffer()從寫模式,轉換到讀模式,可讀取所有資料。
3.讀取完成後,清空緩衝區,可複寫。
清空方式:clear()清空整個緩衝區 ;compact()清楚已經讀過的所有資料。
未讀的資料放到緩衝區起始位置,新寫入的資料將放到緩衝區未讀資料的後面。





IO和NIO對比

對比之前,先補充一些基礎知識,同步和非同步,阻塞和非阻塞。

1)阻塞、非阻塞


阻塞:一直等到資料準備好;

非阻塞:有就返回資料,沒有直接返回。


2)同步、非同步

同步IO:阻塞某方法,等待IO時間完成;直到讀寫進入執行緒,開銷較大。

非同步IO:IO讀寫交給作業系統,完成後給應用程式一個通知。



現在對比一下IO和NIO:

IO NIO
面向流 面向緩衝區
阻塞、同步 非阻塞、非同步
選擇器Selector


NIO比IO靈活,在資料讀取移動方面;並且Selector可以一個單獨的執行緒監視多個輸入通道。


參考系列部落格:http://ifeve.com/buffers/  



相關文章