Java AIO-Proactor模式

Java7之前只支持BIO颂翼、NIO矫废,但在Java 7 時添加了Java AIO有勾,Java AIO基于epoll模式來模擬實現(xiàn)(Linux 2.6)

阻塞/非阻塞 -- 同步/異步

系統(tǒng)I/O 可分為阻塞型修肠、非阻塞同步型以及非阻塞異步型秫逝。

  1. 阻塞型I/O意味著控制權只到調(diào)用操作結束了才會回到調(diào)用者手里恕出。結果調(diào)用者被阻塞了, 這段時間了做不了任何其它事情.。

  2. 非阻塞同步是會立即返回控制權給調(diào)用者的违帆。調(diào)用者不需要等等浙巫,它從調(diào)用的函數(shù)獲取兩種結果:要么此次調(diào)用成功進行了;要么系統(tǒng)返回錯誤標識告訴調(diào)用者當前資源不可用,你再等等或者再試度看吧前方。

  3. 在非阻塞異步調(diào)用中狈醉,稍有不同。調(diào)用函數(shù)在立即返回時惠险,還告訴調(diào)用者苗傅,這次請求已經(jīng)開始了。系統(tǒng)會使用另外的資源或者線程來完成這次調(diào)用操作班巩,并在完成的時候知會調(diào)用者(比如通過回調(diào)函數(shù))渣慕。

NIO與AIO比較

  1. NIO監(jiān)聽的是什么事件準備好了嘶炭,然后通知當前線程去處理,在通知返回之前需要等待逊桦,并且需要Selector配合通知線程眨猎;AIO監(jiān)聽的什么事件已經(jīng)完成了,然后執(zhí)行對應的處理函數(shù)(系統(tǒng)來開辟一個線程來完成)强经,執(zhí)行完成會通知關心這個事件完成的線程睡陪,在沒有通知時當前線程可以先做自己的事情,當空閑下來的時候檢查一下通知回來的信息匿情,在獲取通知結果時會阻塞兰迫,但是可以設置超時時間,當一段時間沒有還沒有結果炬称,則繼續(xù)干別的事情汁果。

  2. AIO并不比BIO的IO讀寫更快,只是關注事件的階段不一樣玲躯,系統(tǒng)通知線程的方式不一樣据德,但是AIO比NIO簡化了代碼編寫的復雜度,并且效率更高跷车、更高伸縮性棘利。

  3. 由于NIO的讀寫過程依然在應用線程里完成,所以對于那些讀寫過程時間長的朽缴,NIO就不太適合赡译。而AIO的讀寫過程完成后才被通知,所以AIO能夠勝任那些重量級不铆,讀寫過程長的任務。

AIO異步的幾個重要的方法

AIO 的異步操作總體上是基于系統(tǒng)調(diào)用Handler以及返回Future異步結果來實現(xiàn)的裹唆。

  1. AsynchronousFileChannel(由于FileChannel只讀權限誓斥,所以沒有write方法)

程序調(diào)用此方法后立即返回,并由系統(tǒng)將接收的數(shù)據(jù)讀入指定的ByteBuffer中许帐,在讀取完成之后執(zhí)行用戶指定的處理函數(shù)進行處理劳坑,可以綁定一個對象在處理函數(shù)上,以便IO處理函數(shù)可以和用戶程序的信息通信成畦。




程序調(diào)用此方法后立即返回一個Future對象距芬,然后由系統(tǒng)默默地將接收的數(shù)據(jù)讀入指定的ByteBuffer中,用戶通過超時獲取結果Future.get(timeout)循帐,當沒有結果時在超時時間結束時可以干其他的事情框仔,在空閑的時候在進行判斷一下,當讀取完成拄养,系統(tǒng)會在get方法還沒有超時返回离斩,用戶就可以獲得讀取了多少個字節(jié)(get方法讀到的字節(jié)數(shù),返回-1表示文件流結束,超時和沒有字節(jié)可讀都返回0跛梗,超時可以結合Future.isDone()方法判斷任務是否完成)



  1. AsynchronousByteChannel

read方法同上


write方法:
程序調(diào)用此方法后立即返回寻馏,并由系統(tǒng)將指定的ByteBuffer寫入到此通道中,在寫入完成之后執(zhí)行用戶指定的處理函數(shù)進行處理核偿,可以綁定一個對象在處理函數(shù)上诚欠,以便IO處理函數(shù)可以和用戶程序的信息通信。


程序調(diào)用此方法后立即返回一個Future對象漾岳,并由系統(tǒng)將指定的ByteBuffer寫入到此通道中轰绵,用戶通過超時獲取結果Future.get(timeout),當沒有結果時在超時時間結束時可以干其他的事情蝗羊,在空閑的時候在進行判斷一下藏澳,當寫入完成,系統(tǒng)會在get方法還沒有超時返回耀找,用戶就可以獲得寫入了多少個字節(jié)(超時可以結合Future.isDone()方法判斷任務是否完成翔悠。

注意要保證ByteBuffer的線程安全,否則將發(fā)生異常野芒。

  1. AsynchronousSocketChannel

Socket通道還有connect以及open方法
open方法開啟一個異步通道蓄愁,不同于FileChannel(從流文件中獲取)狞悲,socket需要顯示調(diào)用open方法撮抓,開啟通道。



異步連接



異步讀

異步寫
  1. AsynchronousServerSocketChannel

ServerSocketChannel沒有讀寫操作摇锋,但是有open丹拯,bind以及異步accept方法
open方法



bind方法



異步accept方法
  1. CompletionHandler處理函數(shù)接口

客戶端程序



服務端程序






測試結果

客戶端

服務端

源碼地址
https://github.com/zhanglbjames/exercises/blob/master/src/main/java/test/TestProactorClient.java
https://github.com/zhanglbjames/exercises/blob/master/src/main/java/test/TestProactorServer.java

參考鏈接
http://www.tuicool.com/articles/3uMBNf

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市荸恕,隨后出現(xiàn)的幾起案子乖酬,更是在濱河造成了極大的恐慌,老刑警劉巖融求,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咬像,死亡現(xiàn)場離奇詭異,居然都是意外死亡生宛,警方通過查閱死者的電腦和手機县昂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陷舅,“玉大人倒彰,你說我怎么就攤上這事±痴觯” “怎么了狸驳?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵预明,是天一觀的道長。 經(jīng)常有香客問我耙箍,道長撰糠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任辩昆,我火速辦了婚禮阅酪,結果婚禮上,老公的妹妹穿的比我還像新娘汁针。我一直安慰自己术辐,他們只是感情好,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布施无。 她就那樣靜靜地躺著辉词,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猾骡。 梳的紋絲不亂的頭發(fā)上瑞躺,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音兴想,去河邊找鬼幢哨。 笑死,一個胖子當著我的面吹牛嫂便,可吹牛的內(nèi)容都是我干的捞镰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼毙替,長吁一口氣:“原來是場噩夢啊……” “哼岸售!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起厂画,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤冰评,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后木羹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡解孙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年坑填,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弛姜。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡脐瑰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出廷臼,到底是詐尸還是另有隱情苍在,我是刑警寧澤绝页,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站寂恬,受9級特大地震影響续誉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜初肉,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一酷鸦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牙咏,春花似錦臼隔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丁寄,卻和暖如春氨淌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狡逢。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工宁舰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奢浑。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓蛮艰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親雀彼。 傳聞我的和親對象是個殘疾皇子壤蚜,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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