這篇文章主要為大家展示了Java有哪三種IO模型,內(nèi)容簡而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。

成都創(chuàng)新互聯(lián)2013年至今,先為魚峰等服務(wù)建站,魚峰等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為魚峰企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
Java中IO的模型分為三種,同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO。
BIO【同步阻塞】
在JDK1.4出來之前,我們建立網(wǎng)絡(luò)連接的時候采用BIO模式,需要先在服務(wù)端啟動一個ServerSocket,然后在客戶端啟動Socket來對服務(wù)端進(jìn)行通信,默認(rèn)情況下服務(wù)端需要對每個請求建立一堆線程等待請求,而客戶端發(fā)送請求后,先咨詢服務(wù)端是否有線程相應(yīng),如果沒有則會一直等待或者遭到拒絕請求,如果有的話,客戶端會線程會等待請求結(jié)束后才繼續(xù)執(zhí)行。
NIO【同步非阻塞】
NIO本身是基于事件驅(qū)動思想來完成的,其主要想解決的是BIO的大并發(fā)問題: 在使用同步I/O的網(wǎng)絡(luò)應(yīng)用中,如果要同時處理多個客戶端請求,或是在客戶端要同時和多個服務(wù)器進(jìn)行通訊,就必須使用多線程來處理。也就是說,將每一個客戶端請求分配給一個線程來單獨處理。這樣做雖然可以達(dá)到我們的要求,但同時又會帶來另外一個問題。由于每創(chuàng)建一個線程,就要為這個線程分配一定的內(nèi)存空間(也叫工作存儲器),而且操作系統(tǒng)本身也對線程的總數(shù)有一定的限制。如果客戶端的請求過多,服務(wù)端程序可能會因為不堪重負(fù)而拒絕客戶端的請求,甚至服務(wù)器可能會因此而癱瘓。
NIO基于Reactor,當(dāng)socket有流可讀或可寫入socket時,操作系統(tǒng)會相應(yīng)的通知引用程序進(jìn)行處理,應(yīng)用再將流讀取到緩沖區(qū)或?qū)懭氩僮飨到y(tǒng)。 也就是說,這個時候,已經(jīng)不是一個連接就要對應(yīng)一個處理線程了,而是有效的請求,對應(yīng)一個線程,當(dāng)連接沒有數(shù)據(jù)時,是沒有工作線程來處理的。
BIO與NIO一個比較重要的不同,是我們使用BIO的時候往往會引入多線程,每個連接一個單獨的線程;而NIO則是使用單線程或者只使用少量的多線程,每個連接共用一個線程。
NIO的最重要的地方是當(dāng)一個連接創(chuàng)建后,不需要對應(yīng)一個線程,這個連接會被注冊到多路復(fù)用器上面,所以所有的連接只需要一個線程就可以搞定,當(dāng)這個線程中的多路復(fù)用器進(jìn)行輪詢的時候,發(fā)現(xiàn)連接上有請求的話,才開啟一個線程進(jìn)行處理,也就是一個請求一個線程模式。
在NIO的處理方式中,當(dāng)一個請求來的話,開啟線程進(jìn)行處理,可能會等待后端應(yīng)用的資源(JDBC連接等),其實這個線程就被阻塞了,當(dāng)并發(fā)上來的話,還是會有BIO一樣的問題。
HTTP/1.1出現(xiàn)后,有了Http長連接,這樣除了超時和指明特定關(guān)閉的http header外,這個鏈接是一直打開的狀態(tài)的,這樣在NIO處理中可以進(jìn)一步的進(jìn)化,在后端資源中可以實現(xiàn)資源池或者隊列,當(dāng)請求來的話,開啟的線程把請求和請求數(shù)據(jù)傳送給后端資源池或者隊列里面就返回,并且在全局的地方保持住這個現(xiàn)場(哪個連接的哪個請求等),這樣前面的線程還是可以去接受其他的請求,而后端的應(yīng)用的處理只需要執(zhí)行隊列里面的就可以了,這樣請求處理和后端應(yīng)用是異步的.當(dāng)后端處理完,到全局地方得到現(xiàn)場,產(chǎn)生響應(yīng),這個就實現(xiàn)了異步處理。
AIO【異步非阻塞】
與NIO不同,當(dāng)進(jìn)行讀寫操作時,只須直接調(diào)用API的read或write方法即可。這兩種方法均為異步的,對于讀操作而言,當(dāng)有流可讀取時,操作系統(tǒng)會將可讀的流傳入read方法的緩沖區(qū),并通知應(yīng)用程序;對于寫操作而言,當(dāng)操作系統(tǒng)將write方法傳遞的流寫入完畢時,操作系統(tǒng)主動通知應(yīng)用程序。 即可以理解為,read/write方法都是異步的,完成后會主動調(diào)用回調(diào)函數(shù)。 在JDK1.7中,這部分內(nèi)容被稱作NIO.2,主要在java.nio.channels包下增加了下面四個異步通道:
AsynchronousSocketChannel
AsynchronousServerSocketChannel
AsynchronousFileChannel
AsynchronousDatagramChannel
其中的read/write方法,會返回一個帶回調(diào)函數(shù)的對象,當(dāng)執(zhí)行完讀取/寫入操作后,直接調(diào)用回調(diào)函數(shù)。
先來個例子理解一下概念
以銀行取款為例:
Java對BIO、NIO、AIO的支持:
BIO、NIO、AIO適用場景分析:
在比較這兩個模式之前,我們首先的搞明白幾個概念,什么是阻塞和非阻塞,什么是同步和異步,同步和異步是針對應(yīng)用程序和內(nèi)核的交互而言的,同步指的是用戶進(jìn)程觸發(fā)IO操作并等待或者輪詢的去查看IO操作是否就緒,而異步是指用戶進(jìn)程觸發(fā)IO操作以后便開始做自己的事情,而當(dāng)IO操作已經(jīng)完成的時候會得到IO完成的通知。
而阻塞和非阻塞是針對于進(jìn)程在訪問數(shù)據(jù)的時候,根據(jù)IO操作的就緒狀態(tài)來采取的不同方式,說白了是一種讀取或者寫入操作函數(shù)的實現(xiàn)方式,阻塞方式下讀取或者寫入函數(shù)將一直等待,而非阻塞方式下,讀取或者寫入函數(shù)會立即返回一個狀態(tài)值。
一般來說I/O模型可以分為:同步阻塞,同步非阻塞,異步阻塞,異步非阻塞
以上就是關(guān)于Java有哪三種IO模型的內(nèi)容,如果你們有學(xué)習(xí)到知識或者技能,可以把它分享出去讓更多的人看到。
分享文章:Java有哪三種IO模型
標(biāo)題URL:http://chinadenli.net/article12/jpsogc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、響應(yīng)式網(wǎng)站、品牌網(wǎng)站制作、軟件開發(fā)、面包屑導(dǎo)航、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)