Java NIO(四):Selector

Selector 作用

  • Selector (選擇器)用于檢測一到多個 NIO Channel(通道)糙申,監(jiān)聽通道的事件口猜,這樣一個線程就可以管理多個通道草描,從而管理多個網(wǎng)絡(luò)連接
  • 線程處理多個 Channel 好處是只需要更少的線程來處理通道战虏,線程之間上下切話開銷很大距贷,且每個線程要占用一些系統(tǒng)資源

Selector 使用

  • 創(chuàng)建 Selector
Selector selector = Selector.open();
  • 向 Selector 注冊通道 ,通道必須處于非阻塞模式(通過configureBlocking配置)相叁,這意味著不支持 FileChannel
channel.configureBlocking(false);
SelectionKey key = channel.register(selector,Selectionkey.OP_READ);
  • register() 方法的第二個參數(shù)用于指定 Selector 監(jiān)聽 Channel 的哪些事件遵绰,多個事件用 | 位運算得到事件集合的值,共有以下四種事件:
    • Connect(SelectionKey.OP_CONNECT)某個 Channel 連接到另一個服務(wù)器稱為“連接就緒”
    • Accept(SelectionKey.OP_ACCEPT):ServerSocketChannel 準(zhǔn)備接收新進入的連接稱為“接收就緒”
    • Read(SelectionKey.OP_READ):一個有數(shù)據(jù)可讀的通道為“讀就緒”
    • Write(SelectionKey.OP_WRITE):等待寫入的數(shù)據(jù)通道為“寫就緒”
int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE;

SelectionKey

  • 當(dāng)向 Selector 注冊 Channel 時會返回一個 SelectionKey 對象增淹,它包含了一些屬性方法

    • interest 集合:該屬性包含了我們要求 Selector 監(jiān)聽該 Channel 的事件
    int interestSet = selectionKey.interestOps();
    
    boolean isInterestedInAccept  = (interestSet & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT椿访;
    
    • ready 集合:表示已經(jīng)準(zhǔn)備就緒的操作的集合,用來檢測 Channel 中什么事件已經(jīng)就緒
    // 可以通過位運算得出的結(jié)果值來判斷準(zhǔn)備就緒的事件集合
    int readySet = selectionKey.readyOps();
    // 也可以采用下面方法
    selectionKey.isAcceptable();
    selectionKey.isConnectable();
    selectionKey.isReadable();
    selectionKey.isWritable();
    
    • channel 與 selector:返回 Channel 對象與 Selector 對象
    Channel  channel  = selectionKey.channel();
    Selector selector = selectionKey.selector();
    
    • 附件對象:可以將一個對象或更多信息附加到 SelectionKey 上虑润,方便識別通道成玫,通過 attach 方法附加,通過 attachment 獲取附加對象
    selectionKey.attach(theObject);
    Object attachedObj = selectionKey.attachment();
    

Select 方法

  • select() 會返回要求 Selector 監(jiān)聽其通道的某些事件端辱,且事件已準(zhǔn)備就緒的通道
    • select():阻塞到至少有一個通道的事件準(zhǔn)備就緒
    • select(long timeout):指定最長會阻塞多少毫秒
    • selectNow():不會阻塞梁剔,不管什么通道就緒都立刻返回(如果在前一次 select() 操作后,沒有通道變成可選擇的舞蔽,則此方法直接返回零)
  • 返回的 int 值表示有多少通道已經(jīng)就緒荣病。即上次調(diào)用 select() 方法后有多少通道變成就緒狀態(tài)

SelectedKeys

  • 當(dāng)調(diào)用了 select() 方法后返回值表明有一個或更多個通道就緒時,就可以調(diào)用 selectedKeys() 方法渗柿,獲取已就緒的通道
selector.select();   
Set<SelectionKey> selectionKeys = selector.selectedKeys();
  • 遍歷就緒的通道个盆,注意你須在處理完通道時清空 SelectionKey 集合,當(dāng)下次該通道變成就緒時朵栖,Selector 才會再次將其放入 SelectionKey 中
selectionKeys.forEach(selectionKey -> {
    if(selectionKey.isAcceptable()) {
    } else if (selectionKey.isConnectable()) {
    } else if (selectionKey.isReadable()) {
    } else if (selectionKey.isWritable()) {
    }
});
selectionKeys.clear(); // 清除處理過的事件

其它方法

  • wakeUp():當(dāng)調(diào)用 select() 后即使沒有通道已經(jīng)就緒颊亮,線程處于阻塞中,只要讓其它線程調(diào)用該對象的 wakeup() 方法即可讓 select() 立馬返回停止阻塞
  • close():close() 會關(guān)閉 Selector陨溅,且使注冊到該 Selector 上的所有 SelectionKey 實例無效终惑,但通道本身并不會關(guān)閉
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市门扇,隨后出現(xiàn)的幾起案子雹有,更是在濱河造成了極大的恐慌,老刑警劉巖臼寄,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霸奕,死亡現(xiàn)場離奇詭異,居然都是意外死亡吉拳,警方通過查閱死者的電腦和手機质帅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人煤惩,你說我怎么就攤上這事嫉嘀。” “怎么了盟庞?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵吃沪,是天一觀的道長。 經(jīng)常有香客問我什猖,道長票彪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任不狮,我火速辦了婚禮降铸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摇零。我一直安慰自己推掸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布驻仅。 她就那樣靜靜地躺著谅畅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪噪服。 梳的紋絲不亂的頭發(fā)上毡泻,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音粘优,去河邊找鬼仇味。 笑死,一個胖子當(dāng)著我的面吹牛雹顺,可吹牛的內(nèi)容都是我干的丹墨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼嬉愧,長吁一口氣:“原來是場噩夢啊……” “哼贩挣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起没酣,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤王财,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后四康,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡狭握,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年闪金,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡哎垦,死狀恐怖囱嫩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漏设,我是刑警寧澤墨闲,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站郑口,受9級特大地震影響鸳碧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜犬性,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一瞻离、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乒裆,春花似錦套利、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至稿黄,卻和暖如春喊衫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抛猖。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工格侯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人财著。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓联四,卻偏偏與公主長得像,于是被迫代替她去往敵國和親撑教。 傳聞我的和親對象是個殘疾皇子朝墩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

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

  • Java NIO(New IO)是從Java 1.4版本開始引入的一個新的IO API,可以替代標(biāo)準(zhǔn)的Java I...
    JackChen1024閱讀 7,536評論 1 143
  • 參考:http://ifeve.com/selectors/原文地址 目錄 Java NIO教程 Java NIO...
    步積閱讀 4,466評論 3 10
  • 背景 java.nio全稱java non-blocking IO伟姐,是指jdk1.4 及以上版本里提供的新api(...
    ninetyhe_閱讀 406評論 0 0
  • 選擇器是Java NIO組件收苏,它可以檢查一個或多個NIO通道,并確定哪些通道準(zhǔn)備好 閱讀或?qū)懽鳌?這樣一個單一的線...
    FantJ閱讀 735評論 0 3
  • Selector(選擇器)是Java NIO中能夠同時監(jiān)測多個Channel通道愤兵,并且還能知道Channel上讀寫...
    zhanglbjames閱讀 3,060評論 0 6