這么說(shuō)吧,NIO很簡(jiǎn)單,其實(shí)就是個(gè)牛逼IO

我是風(fēng)月連城,喜歡用簡(jiǎn)單的語(yǔ)言闡述知識(shí)點(diǎn)

長(zhǎng)期分享原創(chuàng)java文章,分享進(jìn)階架構(gòu)師學(xué)習(xí)筆記及學(xué)習(xí)資料

喜歡的可以點(diǎn)贊關(guān)注,共同學(xué)習(xí),一起進(jìn)步



0 ) 哈哈,其實(shí)我是個(gè)標(biāo)題黨,NIO不是牛逼IO,是非阻塞IO

NIO 也能算是一種思想,非阻塞IO通信思想,Netty就是基于NIO思想的NIO框架,

想花一分鐘知道Netty是什么的可以看看這么說(shuō)吧,Netty很簡(jiǎn)單,其實(shí)就是個(gè)Jar包,是作為通訊組件用的

什么是非阻塞?(為什么我沒(méi)有說(shuō)什么是IO,既然你都學(xué)到NIO了,,,要是不知道什么是IO的話我也沒(méi)辦法咯..)

這篇文章也是簡(jiǎn)單介紹NIO,想要看各類源碼的同學(xué)可以繞道了- -


1 ) 異步非阻塞例子:(網(wǎng)上看到的比較短小精悍的好例子,直接拿過(guò)來(lái)了)

老張愛(ài)喝茶,廢話不說(shuō),煮開(kāi)水。

出場(chǎng)人物:老張,水壺兩把(普通水壺,簡(jiǎn)稱水壺;會(huì)響的水壺,簡(jiǎn)稱響水壺)。

1 老張把水壺放到火上,原地不動(dòng)等水開(kāi)。(同步阻塞)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?---------->老張覺(jué)得自己有點(diǎn)傻

2 老張把水壺放到火上,去客廳看毛騙,時(shí)不時(shí)去看看水開(kāi)沒(méi)有。(同步非阻塞)?

?---------->老張覺(jué)得自己有點(diǎn)傻

于是變高端了,買了把會(huì)響笛的那種水壺。水開(kāi)之后,能大聲發(fā)出嘀~~~~的響聲。

3 老張把響水壺放到火上,立等水開(kāi)。(異步阻塞)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

?--------->老張覺(jué)得自己有點(diǎn)傻

4 老張把響水壺放到火上,去客廳看毛騙,水壺響之前不再去看它,響了再去拿壺。(異步非阻塞)?

---------->嗯,老張覺(jué)得自己棒棒噠


2 ) 小結(jié):簡(jiǎn)單講,Java NIO的非阻塞模式就是,使一個(gè)線程從某通道發(fā)送請(qǐng)求讀取(或者寫入)數(shù)據(jù),(如燒水)

他不是保持線程阻塞,所以在讀取(或者寫入)數(shù)據(jù)前,該線程可以繼續(xù)做其他的事情。? ? ? (例如客廳看毛騙)


3 )? IO VS NIO 的比較? (不同之處)

1.IO只能實(shí)現(xiàn)阻塞式的網(wǎng)絡(luò)通信。NIO能夠?qū)崿F(xiàn)非阻塞的網(wǎng)絡(luò)通信.(廢話)

2.標(biāo)準(zhǔn)IO基于字節(jié)/字符流進(jìn)行操作;而NIO是基于通道(Channel)進(jìn)行操作的。(話說(shuō),通往女人心靈的通道是xxx道...)

3.流的讀寫通常是單向的,要么輸入,要么輸出,不能既是輸入流又是輸出流。通道是雙向的,既可以寫數(shù)據(jù)到通道,又可以從通道中讀取數(shù)據(jù);


4 ) 學(xué)習(xí)目標(biāo) : 雖然現(xiàn)在我們不會(huì)直接編寫NIO來(lái)完成我們的網(wǎng)絡(luò)層通訊,而是使用成熟的基于NIO的網(wǎng)絡(luò)框架來(lái)實(shí)現(xiàn)我們的網(wǎng)絡(luò)層。如,netty、mina。但對(duì)NIO網(wǎng)絡(luò)編程過(guò)程的了解,非常有助于我們更深入的理解netty、mina等網(wǎng)絡(luò)框架,以至于能更好的使用它們。有人問(wèn)了,不學(xué)這個(gè)對(duì)我敲代碼有何影響,可以說(shuō),毛影響都沒(méi).


5 ) 知道什么是NIO后,我們?cè)賮?lái)看看java NIO的三個(gè)重要組成部分:

Channel(通道),Buffer(緩沖區(qū)),Selector(選擇器)。

當(dāng)然,類比學(xué)習(xí)是比較好的學(xué)習(xí)方法,這里我仍然跟傳統(tǒng)IO做比較,希望他不要打我


6 ) Channel ( 通道 ),顧名思義,就是通向什么的道路,為某個(gè)提供了渠道。

1.傳統(tǒng)IO中,Stream是單向的,比如InputStream只能進(jìn)行讀取操作,OutputStream只能進(jìn)行寫操作。

而Channel是雙向的,既可用來(lái)進(jìn)行讀操作,又可用來(lái)進(jìn)行寫操作。

2.具體的常見(jiàn)實(shí)現(xiàn)通道有FileChannel,SocketChanel,ServerSocketChannel,DatagramChannel等

跟具體的實(shí)現(xiàn)流FileInputStream,FileOutputStream,FileReader,FileWriter,節(jié)點(diǎn)流包裝流緩沖流等等功能類似


7 ) Buffer(緩沖區(qū)),是NIO中非常重要的一個(gè)東西,實(shí)際上就是一個(gè)容器,是一個(gè)連續(xù)數(shù)組。在NIO中所有數(shù)據(jù)的讀和寫都離不開(kāi)Buffer。在NIO中,讀取的數(shù)據(jù)只能放在Buffer中。同樣地,寫入數(shù)據(jù)也是先寫入到Buffer中。

上面的圖描述了從一個(gè)客戶端向服務(wù)端發(fā)送數(shù)據(jù),然后服務(wù)端接收數(shù)據(jù)的過(guò)程。

簡(jiǎn)單的講就是,要想使用Channel(通道)傳遞數(shù)據(jù),必須先把數(shù)據(jù)丟進(jìn)Buffer(緩沖區(qū),容器)里.


在NIO中,Buffer是一個(gè)頂層父類,它是一個(gè)抽象類,常用的Buffer的子類有:

ByteBuffer,IntBuffer,CharBuffer,LongBuffer,DoubleBuffer,FloatBuffer,ShortBuffer等


8 ) Selector , 可以說(shuō)它是NIO中最關(guān)鍵的一個(gè)部分,Selector的作用就是用來(lái)輪詢每個(gè)注冊(cè)的Channel,一旦發(fā)現(xiàn)Channel有注冊(cè)的事件發(fā)生,便獲取事件然后進(jìn)行處理。

以前傳統(tǒng)socket編程時(shí),accept方法會(huì)一直阻塞,直到有客戶端請(qǐng)求的到來(lái),并返回socket進(jìn)行相應(yīng)的處理。整個(gè)過(guò)程是就像上面的例子那樣,直到水壺?zé)_(kāi)了(響應(yīng)回去了)才能去處理下一個(gè)請(qǐng)求.當(dāng)然我們也可以用線程池的模式.

NIO則為我們提供了更好的解決方案,Selector選擇器能夠檢測(cè)多個(gè)注冊(cè)的通道上是否有事件發(fā)生,如果有事件發(fā)生,便獲取事件然后針對(duì)每個(gè)事件進(jìn)行相應(yīng)的響應(yīng)處理。這樣一來(lái),只是用一個(gè)單線程就可以管理多個(gè)通道,也就是管理多個(gè)連接。這樣使得只有在連接真正有讀寫事件發(fā)生時(shí),才會(huì)調(diào)用函數(shù)來(lái)進(jìn)行讀寫,就大大地減少了系統(tǒng)開(kāi)銷,并且不必為每個(gè)連接都創(chuàng)建一個(gè)線程,不用去維護(hù)多個(gè)線程,并且避免了多線程之間的上下文切換導(dǎo)致的開(kāi)銷。并且是按順序處理,基于通道(Channel)和緩沖區(qū)(Buffer)來(lái)傳輸和保存數(shù)據(jù)。

與Selector有關(guān)的一個(gè)關(guān)鍵類是SelectionKey,一個(gè)SelectionKey表示一個(gè)到達(dá)的事件,這2個(gè)類構(gòu)成了服務(wù)端處理業(yè)務(wù)的關(guān)鍵邏輯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,716評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事?!?“怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,746評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,991評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,706評(píng)論 6 413
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 56,036評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,203評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,725評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,451評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,677評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,857評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,266評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,606評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,407評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,643評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容