這篇文章主要為大家展示了Java有哪三種IO模型,內(nèi)容簡(jiǎn)而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會(huì)有收獲的,下面讓小編帶大家一起來(lái)看看吧。
為石首等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及石首網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、石首網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!Java中IO的模型分為三種,同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO。
BIO【同步阻塞】
在JDK1.4出來(lái)之前,我們建立網(wǎng)絡(luò)連接的時(shí)候采用BIO模式,需要先在服務(wù)端啟動(dòng)一個(gè)ServerSocket,然后在客戶(hù)端啟動(dòng)Socket來(lái)對(duì)服務(wù)端進(jìn)行通信,默認(rèn)情況下服務(wù)端需要對(duì)每個(gè)請(qǐng)求建立一堆線(xiàn)程等待請(qǐng)求,而客戶(hù)端發(fā)送請(qǐng)求后,先咨詢(xún)服務(wù)端是否有線(xiàn)程相應(yīng),如果沒(méi)有則會(huì)一直等待或者遭到拒絕請(qǐng)求,如果有的話(huà),客戶(hù)端會(huì)線(xiàn)程會(huì)等待請(qǐng)求結(jié)束后才繼續(xù)執(zhí)行。
NIO【同步非阻塞】
NIO本身是基于事件驅(qū)動(dòng)思想來(lái)完成的,其主要想解決的是BIO的大并發(fā)問(wèn)題: 在使用同步I/O的網(wǎng)絡(luò)應(yīng)用中,如果要同時(shí)處理多個(gè)客戶(hù)端請(qǐng)求,或是在客戶(hù)端要同時(shí)和多個(gè)服務(wù)器進(jìn)行通訊,就必須使用多線(xiàn)程來(lái)處理。也就是說(shuō),將每一個(gè)客戶(hù)端請(qǐng)求分配給一個(gè)線(xiàn)程來(lái)單獨(dú)處理。這樣做雖然可以達(dá)到我們的要求,但同時(shí)又會(huì)帶來(lái)另外一個(gè)問(wèn)題。由于每創(chuàng)建一個(gè)線(xiàn)程,就要為這個(gè)線(xiàn)程分配一定的內(nèi)存空間(也叫工作存儲(chǔ)器),而且操作系統(tǒng)本身也對(duì)線(xiàn)程的總數(shù)有一定的限制。如果客戶(hù)端的請(qǐng)求過(guò)多,服務(wù)端程序可能會(huì)因?yàn)椴豢爸刎?fù)而拒絕客戶(hù)端的請(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è)處理線(xiàn)程了,而是有效的請(qǐng)求,對(duì)應(yīng)一個(gè)線(xiàn)程,當(dāng)連接沒(méi)有數(shù)據(jù)時(shí),是沒(méi)有工作線(xiàn)程來(lái)處理的。
BIO與NIO一個(gè)比較重要的不同,是我們使用BIO的時(shí)候往往會(huì)引入多線(xiàn)程,每個(gè)連接一個(gè)單獨(dú)的線(xiàn)程;而NIO則是使用單線(xiàn)程或者只使用少量的多線(xiàn)程,每個(gè)連接共用一個(gè)線(xiàn)程。
NIO的最重要的地方是當(dāng)一個(gè)連接創(chuàng)建后,不需要對(duì)應(yīng)一個(gè)線(xiàn)程,這個(gè)連接會(huì)被注冊(cè)到多路復(fù)用器上面,所以所有的連接只需要一個(gè)線(xiàn)程就可以搞定,當(dāng)這個(gè)線(xiàn)程中的多路復(fù)用器進(jìn)行輪詢(xún)的時(shí)候,發(fā)現(xiàn)連接上有請(qǐng)求的話(huà),才開(kāi)啟一個(gè)線(xiàn)程進(jìn)行處理,也就是一個(gè)請(qǐng)求一個(gè)線(xiàn)程模式。
在NIO的處理方式中,當(dāng)一個(gè)請(qǐng)求來(lái)的話(huà),開(kāi)啟線(xiàn)程進(jìn)行處理,可能會(huì)等待后端應(yīng)用的資源(JDBC連接等),其實(shí)這個(gè)線(xiàn)程就被阻塞了,當(dāng)并發(fā)上來(lái)的話(huà),還是會(huì)有BIO一樣的問(wèn)題。
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)的話(huà),開(kāi)啟的線(xiàn)程把請(qǐng)求和請(qǐng)求數(shù)據(jù)傳送給后端資源池或者隊(duì)列里面就返回,并且在全局的地方保持住這個(gè)現(xiàn)場(chǎng)(哪個(gè)連接的哪個(gè)請(qǐng)求等),這樣前面的線(xiàn)程還是可以去接受其他的請(qǐng)求,而后端的應(yīng)用的處理只需要執(zhí)行隊(duì)列里面的就可以了,這樣請(qǐng)求處理和后端應(yīng)用是異步的.當(dāng)后端處理完,到全局地方得到現(xiàn)場(chǎng),產(chǎn)生響應(yīng),這個(gè)就實(shí)現(xiàn)了異步處理。
AIO【異步非阻塞】
與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ù)。 在JDK1.7中,這部分內(nèi)容被稱(chēng)作NIO.2,主要在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ù)。
先來(lái)個(gè)例子理解一下概念
以銀行取款為例:
Java對(duì)BIO、NIO、AIO的支持:
BIO、NIO、AIO適用場(chǎng)景分析:
在比較這兩個(gè)模式之前,我們首先的搞明白幾個(gè)概念,什么是阻塞和非阻塞,什么是同步和異步,同步和異步是針對(duì)應(yīng)用程序和內(nèi)核的交互而言的,同步指的是用戶(hù)進(jìn)程觸發(fā)IO操作并等待或者輪詢(xún)的去查看IO操作是否就緒,而異步是指用戶(hù)進(jìn)程觸發(fā)IO操作以后便開(kāi)始做自己的事情,而當(dāng)IO操作已經(jīng)完成的時(shí)候會(huì)得到IO完成的通知。
而阻塞和非阻塞是針對(duì)于進(jìn)程在訪(fǎng)問(wèn)數(shù)據(jù)的時(shí)候,根據(jù)IO操作的就緒狀態(tài)來(lái)采取的不同方式,說(shuō)白了是一種讀取或者寫(xiě)入操作函數(shù)的實(shí)現(xiàn)方式,阻塞方式下讀取或者寫(xiě)入函數(shù)將一直等待,而非阻塞方式下,讀取或者寫(xiě)入函數(shù)會(huì)立即返回一個(gè)狀態(tài)值。
一般來(lái)說(shuō)I/O模型可以分為:同步阻塞,同步非阻塞,異步阻塞,異步非阻塞
以上就是關(guān)于Java有哪三種IO模型的內(nèi)容,如果你們有學(xué)習(xí)到知識(shí)或者技能,可以把它分享出去讓更多的人看到。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站muchs.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
分享名稱(chēng):Java有哪三種IO模型-創(chuàng)新互聯(lián)
本文鏈接:http://muchs.cn/article26/pgijg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、外貿(mào)建站、網(wǎng)站維護(hù)、搜索引擎優(yōu)化、品牌網(wǎng)站制作、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容