Java NIO武契, AIO

示例代碼位置:https://git.oschina.net/silentwu/nio-tutorial.git

一.基本概念解析

1) 阻塞和非阻塞 :

阻塞和非阻塞是進(jìn)程在訪問(wèn)數(shù)據(jù)的時(shí)候,數(shù)據(jù)內(nèi)是否準(zhǔn)備就緒的一種處理方式 , 當(dāng)數(shù)據(jù)沒(méi)有準(zhǔn)備的時(shí)候 阻塞:往往需要等待緩沖區(qū)中的數(shù)據(jù)準(zhǔn)備好過(guò)后才處理其他的事情届垫,否則一直等待在那里
非阻塞 : 當(dāng)我們的進(jìn)程訪問(wèn)我們的數(shù)據(jù)緩沖區(qū)的時(shí)候 數(shù)據(jù)沒(méi)有準(zhǔn)備好的時(shí)候 直接返回 不需要等待 . 數(shù)據(jù)有的時(shí)候 也直接返回 .

2) 同步和異步的方式:

同步和異步都是基于應(yīng)用程序和操作系統(tǒng)處理 IO 時(shí)間鎖采用的方式 . 比如同步應(yīng)用程序要直接參與 IO 讀寫的操作 , 異步:所有的 IO 讀寫交給操作系統(tǒng)去處理 . 同步的方式在處理 IO 事件的時(shí)候 必須阻塞在某個(gè)方法上面等待我們的 IO 時(shí)間完成 ( 阻塞 IO 事件或則通過(guò)輪詢 IO 事件的方式 ), 對(duì)于異步來(lái)說(shuō)钧排,所有的 IO 讀寫都交給了操作系統(tǒng) 這個(gè)時(shí)候 我們可以去做其他的事情 并不需要去完成真正的 IO 操作,當(dāng)操作完成 IO 后 給我們的應(yīng)用程序一個(gè)通知就可以的符衔,
同步 :1) 阻塞到 IO 事件 阻塞到 read 或則 write. 這個(gè)時(shí)候我們就完全不能做自己的事情 . 讓讀寫方法加入到線程里面 然后阻塞線程來(lái)實(shí)現(xiàn) . 對(duì)線程的性能開(kāi)銷比較大 .

3)IO 事件的輪詢 – 多路復(fù)用技術(shù) (select 模式 )

讀寫事件交給一個(gè)單獨(dú)的線程來(lái)處理,這個(gè)完成 IO 事件的注冊(cè)供判族,還有就是不斷的去輪詢我們的讀寫緩沖區(qū) 看是否有數(shù)據(jù)準(zhǔn)備好。 通知我們通知相應(yīng)讀寫線程 . 這樣的話 以前的讀寫線程就可以做其他的事情 這個(gè)時(shí)候阻塞的不是所有的 IO 線程 阻塞的 select 這個(gè)線程 .
Client Select 管家 BOSS
當(dāng)客人來(lái)的時(shí)候 , 就給管家說(shuō) 我來(lái)了槽惫,管家得到這個(gè)注冊(cè)信息后辩撑, 給 BOSS 說(shuō) 我這里有一個(gè)或則多個(gè)客人 , BOSS 你去給某人 A
這件東西各薇,給另外人 B 這樣?xùn)|西君躺。這個(gè)時(shí)候 客人是可以去做自己的事情的,比如看看花園等等棕叫, 當(dāng)管家知道 boss 給他任務(wù)后 他就是去找對(duì)應(yīng)的某人 告訴他 boss 給他某樣?xùn)|西。(根據(jù)我們的注冊(cè)信息)

二.Java IO 模型

BIO:JDK1.4 以前我們使用都是 BIO 阻塞 IO
阻塞到我們的讀寫方法 , 阻塞到線程來(lái)提供性能 . 對(duì)于線程的開(kāi)銷本來(lái)就是性能的浪費(fèi) .
NIO:jdk1.4 linux 多路復(fù)用技術(shù) (select 模式 ) 實(shí)現(xiàn) IO 事件的輪詢方式 : 同步非阻塞的模式 . 這個(gè)種方式目前是主流的網(wǎng)絡(luò)通信模式 .
Mina 疗认, netty mina2.0 netty5.0— 網(wǎng)絡(luò)通信框架 . 比我直接寫 NIO 要容易些 并且代碼可讀性更好
AIO:jdk1.7 (NIO2) 才是實(shí)現(xiàn)真正的異步 aio 伏钠,學(xué)習(xí) linux epoll 模式
AIO 使用的比較少 , 大家可以認(rèn)真的學(xué)習(xí)一些思想
小結(jié) :
1)BIO 阻塞的 IO
2)NIO select+ 非阻塞 同步非阻塞
3)異步非阻塞 IO

三.NIO AIO 原理的解讀

對(duì)于網(wǎng)絡(luò)通信而言 NIO 贝润, AIO 并沒(méi)有改變網(wǎng)通通信的基本步驟,只是在其原來(lái)的基礎(chǔ)上 (serverscoket,socket) 做了一個(gè)改進(jìn) .
Socket <—- 建立連接需要三次握手 —–> serversocket
對(duì)于三次握手的方式建立穩(wěn)定的連接性能開(kāi)銷比較大 . 解決方案從思想上來(lái)說(shuō)比較容易 就是減少連接的次數(shù) . 對(duì)我們的讀寫通信管道進(jìn)行一個(gè)抽象 .

原理四.NIO 原理

image

通過(guò) selctor (選擇器)就相當(dāng)管家 华畏,管理所有的 IO 事件
Connction accept 客服端和服務(wù)端的讀寫 .—–IO 事件

selctor (選擇器)如何進(jìn)行管理 IO 事件
當(dāng) IO 事件注冊(cè)給我們的選擇器的時(shí)候 選擇器會(huì)給他們分配一個(gè) key (可以簡(jiǎn)單的理解成一個(gè)時(shí)間的標(biāo)簽) 當(dāng) IO 事件完成過(guò)通過(guò) key 值來(lái)找到相應(yīng)的管道 然后通過(guò)管道發(fā)送數(shù)據(jù)和接收數(shù)據(jù)等操作 .

數(shù)據(jù)緩沖區(qū):
通過(guò) bytebuffer 亡笑,提供很多讀寫的方法 put () get ()
服務(wù)端: ServerSocketChannel
客服端 : SocketChannel
選擇器 : Selector selector=Select.open(); 這樣就打開(kāi)了我們的選擇器 .

五. Selectionkey:

可以通過(guò)它來(lái)判斷 IO 事件是否已經(jīng)就緒 .
key.isAccptable: 是否可以接受客戶端的連接
Key.isconnctionable: 是否可以連接服務(wù)端
Key.isreadable(): 緩沖區(qū)是否可讀
Key.iswriteable(): 緩沖區(qū)是否可寫

六. 如何獲得事件的 keys

Selectionkey keys= Selector.selectedkeys();

七. 如何注冊(cè)

channel.regist(Selector,Selectionkey.OP_Write);
channel.regist(Selector,Selectionkey.OP_Read);
channel.regist(Selector,Selectionkey.OP_Connct);
channel.regist(Selector,Selectionkey.OP_Accept);

八. AIO:

服務(wù)端 :AsynchronousServerSocketChannel
客服端 :AsynchronousSocketChannel
用戶處理器 :CompletionHandler 接口 , 這個(gè)接口實(shí)現(xiàn)應(yīng)用程序向操作系統(tǒng)發(fā)起 IO 請(qǐng)求 , 當(dāng)完成后處理具體邏輯横朋,否則做自己該做的事情 .

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市衙传,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蓖捶,老刑警劉巖扁远,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畅买,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡谷羞,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雁歌,“玉大人,你說(shuō)我怎么就攤上這事靠瞎∏竺茫” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵父能,是天一觀的道長(zhǎng)净神。 經(jīng)常有香客問(wèn)我,道長(zhǎng)鹃唯,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任黔酥,我火速辦了婚禮跪者,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坑夯。我一直安慰自己,他們只是感情好柜蜈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布淑履。 她就那樣靜靜地躺著,像睡著了一般秘噪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹋偏,一...
    開(kāi)封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天至壤,我揣著相機(jī)與錄音,去河邊找鬼黎棠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛脓斩,可吹牛的內(nèi)容都是我干的畴栖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼挪挤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼关翎!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起纵寝,我...
    開(kāi)封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎葬凳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體火焰,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年占业,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纯赎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡念恍,死狀恐怖晚顷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情该默,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站锅锨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏必搞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一塔橡、第九天 我趴在偏房一處隱蔽的房頂上張望霜第。 院中可真熱鬧,春花似錦泌类、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)桌吃。三九已至,卻和暖如春逗物,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背敬察。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工尔当, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人椭迎。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像缴阎,于是被迫代替她去往敵國(guó)和親简软。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • 這兩天了解了一下關(guān)于NIO方面的知識(shí)建炫,網(wǎng)上關(guān)于這一塊的介紹只是介紹了一下基本用法,沒(méi)有系統(tǒng)的解釋NIO與阻塞肛跌、非阻...
    Ruheng閱讀 7,127評(píng)論 5 48
  • NIO簡(jiǎn)介 *NIO到底是什么的簡(jiǎn)稱察郁?有人喜歡稱之為New IO,因?yàn)樗鄬?duì)于以前的IO是新增的皮钠,所以官方稱之為N...
    謎碌小孩閱讀 1,146評(píng)論 0 9
  • Java NIO(New IO)是從Java 1.4版本開(kāi)始引入的一個(gè)新的IO API麦轰,可以替代標(biāo)準(zhǔn)的Java I...
    JackChen1024閱讀 7,555評(píng)論 1 143
  • 一期虾、基本概念描述 1.1 I/O簡(jiǎn)介 I/O即輸入輸出驯嘱,是計(jì)算機(jī)與外界世界的一個(gè)借口。IO操作的實(shí)際主題是操作系統(tǒng)...
    4ea0af17fd67閱讀 413評(píng)論 0 0
  • 今天靠油滋了茂蚓。 這幾個(gè)字是不是只有東北人懂?小時(shí)候窮啊,一年到頭吃不到什么油水聋涨,菜大都是清湯寡水的, 記憶中那時(shí)吃...
    心若了無(wú)塵閱讀 7,238評(píng)論 5 10