Java NIO核心組件-Selector和Channel

昨天我們介紹了一下SelectorProviderIO multiplexing.特別是IO multiplexing中的epoll系統(tǒng)調(diào)用,是Linux版本的Java的NIO的核心實現(xiàn).

那今天我們就來介紹一下, Java NIO中的核心組件, Selector和Channel.這兩個組件,對于熟悉Java OIO,而不熟悉Java NIO的朋友來說,理解其作用是極其不易的.

前提條件

在閱讀這篇文章之前,如果各位不熟悉甚至沒有聽說過IO multiplexing中的epoll,請務必花時間去了解一下.了解了它們之后,就很容易理解Java NIO的實現(xiàn)了.

這里我們講解的是Linux版本且內(nèi)核版本大于2.6的Java NIO的實現(xiàn),對于其他的系統(tǒng)或者內(nèi)核版本較低的Java NIO,其具體實現(xiàn)是不一樣的.

舉例來說, Linux 內(nèi)核版本大于等于2.6的Java NIO是采用epoll來實現(xiàn)的.而Linux內(nèi)核版本小于2.6的Java NIO,則是采用poll來實現(xiàn)的.

Selector和Channel

SelectorChannel的關系,如下圖所示:

各位如果了解過epoll的話,應該知道epoll_create操作會創(chuàng)建一個需要被監(jiān)聽的file descriptor.然后,epoll_ctl操作會為告訴內(nèi)核,需要監(jiān)聽一個file descripitor的什么事件.最后,使用epoll_wait來告訴內(nèi)核開始監(jiān)聽.

這里我們就可以把Selector比作epoll中的內(nèi)核.把Channel比作epoll_create操作創(chuàng)建的file descriptor.這樣就很容易理解了吧.

因為Java NIO實際上是給我們對IO multiplexing進行了封裝,隱藏了其底層的實現(xiàn).所以我們完全可以這樣來理解.

貼出在Java NIO tutorial中看到的一個圖片,

對于這張圖片,我實在是不能茍同其說法.我們可以看到,在這張圖片中,我們可以看到,一個線程中只有一個Selector,每個Selector負責監(jiān)控三個Channel.而實際上,一個線程中,并不是必須只能有一個Selector.一個Selector也不是只能注冊三個Channel.

AbstractSelector的源碼中,我們可以看到,實際上它只維護了一個不再監(jiān)聽的Channel的集合:

我們查看具體的Selector的父類,SelectorImpl,中的register方法的實現(xiàn).跟具體的Selector實現(xiàn)相關的類,在JDK提供的src.zip源碼包中是找不到的.這里使用CFR反編譯器反編譯rt.jar包.從中找到其實現(xiàn).

我們可以看到,它會把Channel進一步封裝成SelectionKeyImpl.然后使用implRegister方法來實現(xiàn)具體的注冊過程.從SelectorImpl的源碼中,我們同樣可以看到,implRegister方法是一個抽象方法,需要其子類來實現(xiàn)具體的注冊過程.

這里我們感興趣的子類是EPollSelectorImpl,我們查看其源碼,可以看到其中維護了一個從file descriptorSelectionKeyImpl的Map.我們剛剛也提到了,SelectionKeyImpl中,包裝了一個Channel,

我們從EPollSelectorImplimplRegister方法中,也沒有看到會對Map<Integer, SelectionKeyImpl>這個表示EPollSelectorImpl維護的Channel的Map進行尺寸限制的操作.即并沒有限制一個EPollSelectorImpl可以注冊的Channel的數(shù)量.

反而是在Channel中,維護了它向Selector注冊時,Selector給其返回的SelectionKey的集合.相當于維護了它已經(jīng)注冊的Selector的集合.

我們查看AbstractSelectableChannel的向Selector注冊的源碼:

我們可以看到,它會把Selector給它返回的SelectionKey加入到上面我們說過的那個集合中,我們看看addKey()方法的具體實現(xiàn):

在這里我們就可以看到,默認情況下,Channel會創(chuàng)建一個容量為3的表示它注冊的Selector的集合.當它需要向更多的Selector注冊時,則對這個集合進行擴容.

而并沒有提到一個Selector中最多可以注冊多少個Channel.

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抗斤,一起剝皮案震驚了整個濱河市亡蓉,隨后出現(xiàn)的幾起案子轩性,更是在濱河造成了極大的恐慌,老刑警劉巖响驴,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡车摄,警方通過查閱死者的電腦和手機粟誓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門奏寨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鹰服,你說我怎么就攤上這事病瞳。” “怎么了获诈?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵仍源,是天一觀的道長。 經(jīng)常有香客問我舔涎,道長笼踩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任亡嫌,我火速辦了婚禮嚎于,結果婚禮上掘而,老公的妹妹穿的比我還像新娘。我一直安慰自己于购,他們只是感情好袍睡,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肋僧,像睡著了一般斑胜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嫌吠,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天止潘,我揣著相機與錄音,去河邊找鬼辫诅。 笑死凭戴,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的炕矮。 我是一名探鬼主播么夫,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肤视!你這毒婦竟也來了档痪?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤邢滑,失蹤者是張志新(化名)和其女友劉穎钞它,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體殊鞭,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡遭垛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了操灿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锯仪。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖趾盐,靈堂內(nèi)的尸體忽然破棺而出庶喜,到底是詐尸還是另有隱情,我是刑警寧澤救鲤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布久窟,位于F島的核電站,受9級特大地震影響本缠,放射性物質(zhì)發(fā)生泄漏斥扛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一丹锹、第九天 我趴在偏房一處隱蔽的房頂上張望稀颁。 院中可真熱鬧芬失,春花似錦、人聲如沸匾灶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阶女。三九已至颊糜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秃踩,已是汗流浹背芭析。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吞瞪,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓驾孔,卻偏偏與公主長得像芍秆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子翠勉,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

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

  • 這兩天了解了一下關于NIO方面的知識妖啥,網(wǎng)上關于這一塊的介紹只是介紹了一下基本用法,沒有系統(tǒng)的解釋NIO與阻塞对碌、非阻...
    Ruheng閱讀 7,122評論 5 48
  • 概述 Selector是NIO中實現(xiàn)I/O多路復用的關鍵類荆虱。Selector實現(xiàn)了通過一個線程管理多個Channe...
    tomas家的小撥浪鼓閱讀 5,284評論 6 26
  • Java NIO(New IO)是從Java 1.4版本開始引入的一個新的IO API,可以替代標準的Java I...
    JackChen1024閱讀 7,547評論 1 143
  • 作者: 一字馬胡 轉載標志 【2017-11-24】 更新日志 一朽们、Java OIO Java OIO (Jav...
    一字馬胡閱讀 1,344評論 0 12
  • 最近特別著迷Eason的陰天快樂怀读。一遍一遍重復著,絲毫沒有感覺厭煩骑脱,反而越來越喜歡菜枷。 我從小就不喜歡陰天,總覺得陰...
    藍格里西瓜閱讀 384評論 0 2