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