本文目錄一覽:
- 1、在java中使用io,nio,aio的應用場景,有什麼優劣勢
- 2、JAVA NIO 和 AIO 的區別
- 3、java的aio中AsynchronousSocketChannelread第一個參數有什麼用
- 4、JAVA AIO技術怎麼不怎麼用
- 5、為什麼沒有基於java aio的框架
在java中使用io,nio,aio的應用場景,有什麼優劣勢
nio是面向塊的,先把數據搬過來,先存到緩存區裡面,如果線程要用從緩存區拿。所以線程不需要時刻盯著io了,可以先做一些其他的事情,過幾天再來看一下緩存。是同步非阻塞的。因此,nio里有Buffer類作為緩衝區,Channel(通道)相當於io里的steam的抽象,Selector是nio提供的管理多個Channel的工具。nio出現也是因為io漸漸成為一些程序速度的瓶頸。
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中AsynchronousSocketChannelread第一個參數有什麼用
final ByteBuffer buffer = ByteBuffer
.allocateDirect(1024);
// transmitting data
while (asynchronousSocketChannel.read(buffer)
.get() != -1) {
buffer.flip();
}
第一個參數是字元緩衝區對象。
JAVA AIO技術怎麼不怎麼用
1、首先是操作系統的問題,目前Linux系統沒有完全實現AIO,而windows系統雖然對於AIO支持良好,但是我們程序通常運行在Linux主機上,所以對於AIO的使用並不是很頻繁。
2、其次JavaAIO在不是以IO讀寫為核心的並發請求中,效率上並沒有比NIO出色,除非請求涉及到大量的IO操作,而我們更多的Java應用不是非常傾向IO操作。
3、最後對於網路通訊的編程,大多數的時候我們會選用現有的框架,比如Netty,而利用JavaAIO中晦澀API去實現網路通訊,對於我們大多數非網路專業的人來說,是比較困難的。
為什麼沒有基於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.
原創文章,作者:INZZ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/139963.html