多線程初識四

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的函數,形成回調。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章