java BIO NIO AIO理論篇

java中的IO主要源自於網絡和本地文件

IO的方式通常分爲幾種,同步阻塞的BIO同步非阻塞的NIO異步非阻塞的AIO

在JDK1.4出來之前,我們建立的網絡連接的時候採用BIO模式,需要先在服務端啓動一個ServerSocket,然後在客戶端Socket來對服務端進行通信,默認情況下服務端需要對每個請求建立一堆線程等待請求,而客戶端發送請求後,先諮詢服務端是否有線程響應,如果沒有則會一直等待或者遭到拒絕請求,如果有的話,客戶端會等待請求結束後才繼續執行。

BIO與NIO一個比較重要的不同,是我們使用BIO的時候往往會引入多線程,每個連接一個單獨的線程;而NIO則是使用單線程或者使用少量的多線程,每個連接共用一個線程。

NIO的最重要的地方是當一個連接創建後,不需要對應一個線程,這個連接會被註冊到多路複用器上面,所以所有的連接只需要一個線程就可以搞定,當這個線程中的多路複用器進行輪詢的時候,發現連接上有請求的話,纔開啓一個線程進行處理,也就是一個請求一個線程模式。

在NIO的處理方式中,當一個請求來的話,開啓線程進行處理,可能會等待後端的資源(JDBC連接等),其實這個線程就被阻塞了,當並發上來的話,還是會有BIO一樣的問題。

HTTP/1.1出現後,有了Http長連接,這樣除了超時和指明特定關閉的http header外,這個鏈接是一直打開的狀態的,這樣在NIO處理中可以進一步的進化,在後端資源中可以實現資源池或者隊列,當請求來的話,開啓的線程把請求和請求數據傳送給後端資源池或者隊列裏面就返回,並且在全局的地方保持住這個現場(哪個連接的哪個請求等),這樣前面的線程還是可以去接受其他的請求,而後端的應用的處理只需要執行隊列裏面的就可以了,這樣請求處理和後端應用是異步的.當後端處理完,到全局地方得到現場,產生響應,這個就實現了異步處理。

 

     BIO是一個連接一個線程。

   NIO是一個請求一個線程。

   AIO是一個有效請求一個線程。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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