java的I/O是建立在流(stream)之上的苇瓣,而流是同步的尉间,當(dāng)線程請求一個流讀/寫一段數(shù)據(jù)時,線程會一直阻塞下去击罪,直到有數(shù)據(jù)哲嘲、數(shù)據(jù)讀寫完畢或發(fā)生異常時線程才會被重新使用。
BIO編程的基本模型是Client/Server模型媳禁,也就是兩個進程之間進行相互通信眠副,其中服務(wù)器提供位置(ip,port)信息,客戶端通過連接服務(wù)器監(jiān)聽的位置發(fā)請求竣稽,通過三次握手建立連接囱怕,若成功槽唾,則通過Socket進行通信,基于輸入和輸出流的同步阻塞式通信光涂。
NIO(非阻塞I/O)編程
NIO是在JDK 1.4中引入的,人們習(xí)慣稱呼為New I/O或非阻塞I/O(Non-block I/O)拧烦,與原始Socket/ServerSocket類相對應(yīng)忘闻,它提供了SocketChannel和ServerSocketChannel兩種不同的套接字通道實現(xiàn),與基于同步流的I/O不同恋博,它提供了基于緩沖區(qū)Buffer的阻塞和非阻塞兩種開發(fā)模式齐佳。要學(xué)習(xí)NIO首先得掌握它如下的幾個核心概念
NIO緩沖區(qū)概念,上面提過债沮,NIO是面向緩沖塊的高速I/O炼吴,在面向流的I/O中,可以將數(shù)據(jù)直接寫入或讀取到Stream對象中疫衩,在NIO庫中硅蹦,所有數(shù)據(jù)都是通過緩沖區(qū)處理的。
緩沖區(qū)實質(zhì)是一個數(shù)組
通道Channel
Channel是一個通道闷煤,網(wǎng)絡(luò)數(shù)據(jù)通過channel讀取和寫入童芹。通道與流的不同在于通道是雙向的,支持阻塞和非阻塞兩種模式鲤拿。
多路復(fù)用器 Selector
Selector會輪詢注冊在其上的channel假褪,如果某個channel發(fā)生讀或?qū)懯录@個channel就處于就緒狀態(tài)近顷,會被Selector輪詢出來生音,然后通過SelectionKey獲取已經(jīng)就緒的channel集合,進行后續(xù)的I/O操作窒升。
一個多路復(fù)用器Selector可以同時輪詢多個Channel缀遍,一個線程負責(zé)Selector的輪詢,就可以接入成千上萬個客戶端饱须。
NIO是同步非阻塞IO瑟由,同步是因為復(fù)用器會不斷輪詢注冊在其上的channel,但是相比于之前的同步阻塞I/O流冤寿,它是異步的歹苦,所以很多人也稱呼NIO為異步非阻塞I/O,但實際上它是同步的督怜。
四)AIO編程
NIO2.0引入AIO殴瘦,提供了異步文件通道和異步套接字同步,實現(xiàn)了真正意義上的異步非阻塞I/O号杠。它不需要通過多路復(fù)用器Selector對注冊的通道進行輪訓(xùn)操作即可實現(xiàn)異步讀寫蚪腋,從而簡化了NIO的編程模型丰歌。
它提供兩種方式來獲取異步操作結(jié)果
通過Future類來表示異步操作的結(jié)果。
在執(zhí)行異步操作時傳入一個CompletionHandler接口的實現(xiàn)類作為操作完成的回調(diào)屉凯。
作者:miss2008
鏈接:http://www.reibang.com/p/2db793d1c873
來源:簡書
著作權(quán)歸作者所有立帖。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處悠砚。