NIO and AIO
New I/O 與舊式的基於流的I/O相對
再JDK1.4納入,特點:
1、NIO基於塊Block,原來IO是基於流的
2、爲所有的原始類型提供Buffer緩存支持
3、增加通道Channel對象
4、支持鎖和內存映射文件的文件訪問接口
5、提供了基於Selector的異步網絡I/O
總結:
1、Buffer類似bean,通道Channel是具體的發送數據
2、Buffer positon記錄當前位置,capacity緩衝區總容量上限代表總容量上限,limit緩衝器容量實際上限代表可讀取的總容量,也就是說limit小於等於capacity
3、Channel.flip讀寫轉換,操作Buffer把position從尾巴拉到首位
網絡編程
NIO,可以設置ServerSocketChanel.ConfigureBlocking(true/false)是否阻塞讀寫操作
如何實現非阻塞NIO呢?
線程--》selector-->可以輪詢selectorChannel去獲取
NIO非阻塞流程:當selectorChannel準備好數據後,返回selectionKey(表示一對selector和channel的關係),再去拿相應已經準備好的數據
網絡編程流程:
1、設置非阻塞並綁定端口號,在ssc裏面註冊SelectorKey的接收客戶端監聽事件
2、for無限循環監聽客戶端數據{
selector.select(); //此方法是阻塞的,只有當有selector準備好返回了selectorKey之後纔會停止阻塞
獲取selectorKey(set結構)
遍歷Set
{
如果是接收操作,將socketchannel設置爲非阻塞
修改channel,對讀監聽;
如果是讀操作,則讀channel的數據,並讀寫轉換開啓新的線程處理msg,
修改channel,對讀寫都監聽;
如果是寫操作,則獲得的數據寫入channel通道,
寫完則關閉該通道。若該通過無數據,修改channel對讀監聽。
}
}
總結:將等待客戶端的時間放入一個線程中,而不是讓每個請求都開啓一個線程,也不會導致請求延遲的時候該線程會被掛起,節省了數據準備的時間因爲seletor能複用,提高運行的效率!
AIO (異步IO)
特點:
1、讀完了再通知
2、不會加快IO,只是在讀完後進行通知
3、使用回調函數進行業務處理
AsynchronousServerSocketChannel類 異步IO實現類
Future模式
A讓B回調返回數據A,過程:A發送請求給B,B持有A的引用,先返回成功,並新開一個線程去做事情,做完將數據結果調用A的函數,形成回調。