Java中BIO,NIO,AIO

這裏建議不太清楚這個三個概念的可以看我的這篇文章,通俗易懂http://blog.csdn.net/sky_100/article/details/77603576
一、BIO
在JDK1.4出來之前,我們建立網絡連接的時候採用BIO模式,需要先在服務端啓動一個ServerSocket,然後在客戶端啓動Socket來對服務端進行通信,默認情況下服務端需要對每個請求建立一堆線程等待請求,而客戶端發送請求後,先諮詢服務端是否有線程相應,如果沒有則會一直等待或者遭到拒絕請求,如果有的話,客戶端會線程會等待請求結束後才繼續執行。

二、NIO
NIO是New I/O的簡稱,與舊式的基於流的I/O方法相對,從名字看,它表示新的一套Java I/O標 準。它是在Java 1.4中被納入到JDK中的,並具有以下特性:
1.NIO是基於塊(Block)的,它以塊爲基本單位處理數據 (硬盤上存儲的單位也是按Block來存儲,這樣性能上比基於流的方式要好一些)
2.爲所有的原始類型提供(Buffer)緩存支持
3.增加通道(Channel)對象,作爲新的原始 I/O 抽象
4.支持鎖(我們在平時使用時經常能看到會出現一些.lock的文件,這說明有線程正在使用這把鎖,當線程釋放鎖時,會把這個文件刪除掉,這樣其他線程才能繼續拿到這把鎖)和內存映射文件的文件訪問接口
5.提供了基於Selector的異步網絡I/O
這裏寫圖片描述
所有的從通道中的讀寫操作,都要經過Buffer,而通道就是io的抽象,通道的另一端就是操縱的文件。
NIO有一個很大的特點就是:把數據準備好了再通知我
而Channel有點類似於流,一個Channel可以和文件或者網絡Socket對應 。
這裏寫圖片描述
selector是一個選擇器,它可以選擇某一個Channel,然後做些事情。
一個線程可以對應一個selector,而一個selector可以輪詢多個Channel,而每個Channel對應了一個Socket。
與上面一個線程對應一個Socket相比,使用NIO後,一個線程可以輪詢多個Socket。
當selector調用select()時,會查看是否有客戶端準備好了數據。當沒有數據被準備好時,select()會阻塞。平時都說NIO是非阻塞的,但是如果沒有數據被準備好還是會有阻塞現象。
當有數據被準備好時,調用完select()後,會返回一個SelectionKey,SelectionKey表示在某個selector上的某個Channel的數據已經被準備好了。
只有在數據準備好時,這個Channel纔會被選擇。
這樣NIO實現了一個線程來監控多個客戶端。
總結:
1. NIO會將數據準備好後,再交由應用進行處理,數據的讀取/寫入過程依然在應用線程中完成,只是將等待的時間剝離到單獨的線程中去。
2. 節省數據準備時間(因爲Selector可以複用)

三、 AIO
AIO的特點:
1. 讀完了再通知我
2. 不會加快IO,只是在讀完後進行通知
3. 使用回調函數,進行業務處理
在理解了NIO的基礎上,看AIO,區別在於AIO是等讀寫過程完成後再去調用回調函數。
NIO是同步非阻塞的
AIO是異步非阻塞的
由於NIO的讀寫過程依然在應用線程裏完成,所以對於那些讀寫過程時間長的,NIO就不太適合。
而AIO的讀寫過程完成後才被通知,所以AIO能夠勝任那些重量級,讀寫過程長的任務。

參考文章:
http://www.jb51.net/article/92448.htm

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