摘要:即可以理解為,方法都是異步的,完成后會(huì)主動(dòng)調(diào)用回調(diào)函數(shù)。主要在包下增加了下面四個(gè)異步通道其中的方法,會(huì)返回一個(gè)帶回調(diào)函數(shù)的對(duì)象,當(dāng)執(zhí)行完讀取寫(xiě)入操作后,直接調(diào)用回調(diào)函數(shù)。
本文原創(chuàng)地址,我的博客:jsbintask.cn/2019/04/16/…(食用效果最佳),轉(zhuǎn)載請(qǐng)注明出處!
在理解什么是BIO,NIO,AIO之前,我們首先需要了解什么是同步,異步,阻塞,非阻塞。假如我們現(xiàn)在要去銀行取錢: 同步 : 自己親自出馬持銀行卡到銀行取錢(使用同步IO時(shí),Java自己處理IO讀寫(xiě)); 異步 : 委托一小弟拿銀行卡到銀行取錢,然后給你(使用異步IO時(shí),Java將IO讀寫(xiě)委托給OS處理,需要將數(shù)據(jù)緩沖區(qū)地址和大小傳給OS(銀行卡和密碼),OS需要支持異步IO操作API); 阻塞 : ATM排隊(duì)取款,你只能等待(使用阻塞IO時(shí),Java調(diào)用會(huì)一直阻塞到讀寫(xiě)完成才返回); 非阻塞 : 柜臺(tái)取款,取個(gè)號(hào),然后坐在椅子上做其它事,等號(hào)廣播會(huì)通知你辦理,沒(méi)到號(hào)你就不能去,你可以不斷問(wèn)大堂經(jīng)理排到了沒(méi)有,大堂經(jīng)理如果說(shuō)還沒(méi)到你就不能去(使用非阻塞IO時(shí),如果不能讀寫(xiě)Java調(diào)用會(huì)馬上返回,當(dāng)IO事件分發(fā)器會(huì)通知可讀寫(xiě)時(shí)再繼續(xù)進(jìn)行讀寫(xiě),不斷循環(huán)直到讀寫(xiě)完成)
BIOBlocking IO,同步阻塞式IO,jdk1.4以前,一直采用BIO編程模型,在Socket網(wǎng)絡(luò)編程中,我們通常會(huì)使用ServerSocket.accept()方法獲取一個(gè)新連接,該方法會(huì)阻塞當(dāng)前主線程,所以通常一個(gè)連接來(lái)了后,會(huì)將其放入線程池去執(zhí)行后續(xù)操作。而客戶端發(fā)送請(qǐng)求后,先咨詢服務(wù)端是否有線程相應(yīng),如果沒(méi)有則會(huì)一直等待或者遭到拒絕請(qǐng)求,如果有的話,客戶端Socket的connect方法同樣會(huì)阻塞當(dāng)前線程等待請(qǐng)求結(jié)束后才繼續(xù)執(zhí)行。
NIONew IO,同步非阻塞式IO,jdk1.4后引入,主要用于解決BIO大并發(fā)的問(wèn)題,由于BIO會(huì)為任何連接都分配一個(gè)線程,而操作系統(tǒng)資源有限,如果客戶端的請(qǐng)求過(guò)多,服務(wù)端程序可能會(huì)因?yàn)椴豢爸刎?fù)而拒絕客戶端的請(qǐng)求,甚至服務(wù)器可能會(huì)因此而癱瘓。
NIO基于Reactor,當(dāng)socket有流可讀或可寫(xiě)入socket時(shí),操作系統(tǒng)會(huì)相應(yīng)的通知引用程序進(jìn)行處理,應(yīng)用再將流讀取到緩沖區(qū)或?qū)懭氩僮飨到y(tǒng)。 也就是說(shuō),這個(gè)時(shí)候,已經(jīng)不是一個(gè)連接就要對(duì)應(yīng)一個(gè)處理線程了,而是有效的請(qǐng)求,對(duì)應(yīng)一個(gè)線程,當(dāng)連接沒(méi)有數(shù)據(jù)時(shí),是沒(méi)有工作線程來(lái)處理的。
HTTP/1.1出現(xiàn)后,有了Http長(zhǎng)連接,這樣除了超時(shí)和指明特定關(guān)閉的http header外,這個(gè)鏈接是一直打開(kāi)的狀態(tài)的,這樣在NIO處理中可以進(jìn)一步的進(jìn)化,在后端資源中可以實(shí)現(xiàn)資源池或者隊(duì)列,當(dāng)請(qǐng)求來(lái)的話,開(kāi)啟的線程把請(qǐng)求和請(qǐng)求數(shù)據(jù)傳送給后端資源池或者隊(duì)列里面就返回,并且在全局的地方保持住這個(gè)現(xiàn)場(chǎng)(哪個(gè)連接的哪個(gè)請(qǐng)求等),這樣前面的線程還是可以去接受其他的請(qǐng)求,而后端的應(yīng)用的處理只需要執(zhí)行隊(duì)列里面的就可以了,這樣請(qǐng)求處理和后端應(yīng)用是異步的.當(dāng)后端處理完,到全局地方得到現(xiàn)場(chǎng),產(chǎn)生響應(yīng),這個(gè)就實(shí)現(xiàn)了異步處理。
對(duì)應(yīng)BIO中的ServerSocket,Socket,再NIO中的編程類為: ServerSocketChannel, SocketChannel,值得注意的是,它們的accept(),connect方法均不是阻塞的,當(dāng)沒(méi)有連接或者連接沒(méi)有立即建立時(shí),它們都會(huì)直接返回,不會(huì)阻塞當(dāng)前線程!
值得注意的是,雖然jdk已經(jīng)為我們提供了NIO編程模型,但是使用難度較大,并且存在空輪詢的bug。所以一般我們會(huì)考慮使用在 jdk NIO的基礎(chǔ)上繼續(xù)封裝的Netty!
AIONIO.2,異步非阻塞IO。jdk1.7引入。與NIO不同,當(dāng)進(jìn)行讀寫(xiě)操作時(shí),只須直接調(diào)用API的read或write方法即可。這兩種方法均為異步的,對(duì)于讀操作而言,當(dāng)有流可讀取時(shí),操作系統(tǒng)會(huì)將可讀的流傳入read方法的緩沖區(qū),并通知應(yīng)用程序;對(duì)于寫(xiě)操作而言,當(dāng)操作系統(tǒng)將write方法傳遞的流寫(xiě)入完畢時(shí),操作系統(tǒng)主動(dòng)通知應(yīng)用程序。 即可以理解為,read/write方法都是異步的,完成后會(huì)主動(dòng)調(diào)用回調(diào)函數(shù)。 主要在java.nio.channels包下增加了下面四個(gè)異步通道: AsynchronousSocketChannel, AsynchronousServerSocketChannel, AsynchronousFileChannel, AsynchronousDatagramChannel 其中的read/write方法,會(huì)返回一個(gè)帶回調(diào)函數(shù)的對(duì)象,當(dāng)執(zhí)行完讀取/寫(xiě)入操作后,直接調(diào)用回調(diào)函數(shù)。
關(guān)注我,這里只有干貨!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/7196.html
摘要:后改良為用線程池的方式代替新增線程,被稱為偽異步。最大的問(wèn)題是阻塞,同步。每次請(qǐng)求都由程序執(zhí)行并返回,這是同步的缺陷。這些都會(huì)被注冊(cè)在多路復(fù)用器上。多路復(fù)用器提供選擇已經(jīng)就緒狀態(tài)任務(wù)的能力。并沒(méi)有采用的多路復(fù)用器,而是使用異步通道的概念。 Netty是一個(gè)提供異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用框架,用以快速開(kāi)發(fā)高性能、高可靠的網(wǎng)絡(luò)服務(wù)器和客戶端程序。Netty簡(jiǎn)化了網(wǎng)絡(luò)程序的開(kāi)發(fā),是很多框架和公司...
摘要:后改良為用線程池的方式代替新增線程,被稱為偽異步。最大的問(wèn)題是阻塞,同步。每次請(qǐng)求都由程序執(zhí)行并返回,這是同步的缺陷。這些都會(huì)被注冊(cè)在多路復(fù)用器上。多路復(fù)用器提供選擇已經(jīng)就緒狀態(tài)任務(wù)的能力。并沒(méi)有采用的多路復(fù)用器,而是使用異步通道的概念。 Netty是一個(gè)提供異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用框架,用以快速開(kāi)發(fā)高性能、高可靠的網(wǎng)絡(luò)服務(wù)器和客戶端程序。Netty簡(jiǎn)化了網(wǎng)絡(luò)程序的開(kāi)發(fā),是很多框架和公司...
摘要:阻塞請(qǐng)求結(jié)果返回之前,當(dāng)前線程被掛起。也就是說(shuō)在異步中,不會(huì)對(duì)用戶線程產(chǎn)生任何阻塞。當(dāng)前線程在拿到此次請(qǐng)求結(jié)果的過(guò)程中,可以做其它事情。事實(shí)上,可以只用一個(gè)線程處理所有的通道。 準(zhǔn)備知識(shí) 同步、異步、阻塞、非阻塞 同步和異步說(shuō)的是服務(wù)端消息的通知機(jī)制,阻塞和非阻塞說(shuō)的是客戶端線程的狀態(tài)。已客戶端一次網(wǎng)絡(luò)請(qǐng)求為例做簡(jiǎn)單說(shuō)明: 同步同步是指一次請(qǐng)求沒(méi)有得到結(jié)果之前就不返回。 異步請(qǐng)求不會(huì)...
摘要:采用通信模型的服務(wù)端通常由一個(gè)獨(dú)立的線程負(fù)責(zé)監(jiān)聽(tīng)客戶端的連接它接收到客戶端連接請(qǐng)求之后為每個(gè)客戶端創(chuàng)建一個(gè)新的線程進(jìn)行鏈路處理處理完成之后通過(guò)輸出流返回應(yīng)答給客戶端線程銷毀這就是典型的一請(qǐng)求一應(yīng)答通信模型該模型最大的問(wèn)題就是缺乏彈性伸縮能力 BIO 采用 BIO 通信模型的服務(wù)端, 通常由一個(gè)獨(dú)立的 Acceptor 線程負(fù)責(zé)監(jiān)聽(tīng)客戶端的連接, 它接收到客戶端連接請(qǐng)求之后為每個(gè)客戶端創(chuàng)...
摘要:一概述在引入同步非阻塞包之后,終于在版本加入了異步的。注意,無(wú)論用還是,這里的調(diào)用都是非阻塞的立即返回。不過(guò),由于朝鮮還沒(méi)有研發(fā)出能夠重返大氣層的運(yùn)載火箭,所以大浦洞號(hào)尚不具備搭載彈頭的攻擊能力。 一、概述 JDK在1.4引入NIO(同步非阻塞)包之后,終于在1.7版本加入了異步IO的AIO。同步異步阻塞和非阻塞等概念,建議參考 《Unix網(wǎng)絡(luò)編程》 卷1. ,這里只談AIO的api。...
閱讀 2018·2021-10-11 10:59
閱讀 1127·2021-09-07 09:59
閱讀 2292·2021-08-27 16:17
閱讀 2845·2019-08-30 15:54
閱讀 2324·2019-08-30 12:58
閱讀 1832·2019-08-30 12:53
閱讀 1524·2019-08-28 18:13
閱讀 793·2019-08-26 13:35