本文目錄一覽:
JAVA AIO技術怎麼不怎麼用
1、首先是操作系統的問題,目前Linux系統沒有完全實現AIO,而windows系統雖然對於AIO支持良好,但是我們程序通常運行在Linux主機上,所以對於AIO的使用並不是很頻繁。
2、其次JavaAIO在不是以IO讀寫為核心的並發請求中,效率上並沒有比NIO出色,除非請求涉及到大量的IO操作,而我們更多的Java應用不是非常傾向IO操作。
3、最後對於網絡通訊的編程,大多數的時候我們會選用現有的框架,比如Netty,而利用JavaAIO中晦澀API去實現網絡通訊,對於我們大多數非網絡專業的人來說,是比較困難的。
JAVA NIO 和 AIO 的區別
Java NIO : 同步非阻塞,服務器實現模式為一個請求一個線程,即客戶端發送的連接請求都會註冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理。
Java AIO(NIO.2) : 異步非阻塞,服務器實現模式為一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啟動線程進行處理,
NIO方式適用於連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,並發局限於應用中,編程比較複雜,JDK1.4開始支持。
AIO方式使用於連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用OS參與並發操作,編程比較複雜,JDK7開始支持
I/O屬於底層操作,需要操作系統支持,並發也需要操作系統的支持,所以性能方面不同操作系統差異會比較明顯。另外NIO的非阻塞,需要一直輪詢,也是一個比較耗資源的。所以出現AIO
為什麼沒有基於java aio的框架
如果是指基於jdk7的aio,確實沒有,但是如果說是異步事件驅動,netty就算是的。
jre1.7後才只支持aio,但是實際上netty框架就是支持異步IO的了。
Netty:
Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers clients.
java中bio nio aio的區別和聯繫
BIO是一個連接一個線程。
NIO是一個請求一個線程。
AIO是一個有效請求一個線程。
先來個例子理解一下概念,以銀行取款為例:
同步 : 自己親自出馬持銀行卡到銀行取錢(使用同步IO時,Java自己處理IO讀寫);
異步 : 委託一小弟拿銀行卡到銀行取錢,然後給你(使用異步IO時,Java將IO讀寫委託給OS處理,需要將數據緩衝區地址和大小傳給OS(銀行卡和密碼),OS需要支持異步IO操作API);
阻塞 : ATM排隊取款,你只能等待(使用阻塞IO時,Java調用會一直阻塞到讀寫完成才返回);
非阻塞 : 櫃檯取款,取個號,然後坐在椅子上做其它事,等號廣播會通知你辦理,沒到號你就不能去,你可以不斷問大堂經理排到了沒有,大堂經理如果說還沒到你就不能去(使用非阻塞IO時,如果不能讀寫Java調用會馬上返回,當IO事件分發器會通知可讀寫時再繼續進行讀寫,不斷循環直到讀寫完成)
Java對BIO、NIO、AIO的支持:
Java BIO : 同步並阻塞,服務器實現模式為一個連接一個線程,即客戶端有連接請求時服務器端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。
Java NIO : 同步非阻塞,服務器實現模式為一個請求一個線程,即客戶端發送的連接請求都會註冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理。
Java AIO(NIO.2) : 異步非阻塞,服務器實現模式為一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啟動線程進行處理,
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/297914.html