<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    向左走,向右走。。。
    永遠(yuǎn)不回頭
    posts - 16,comments - 17,trackbacks - 0
    在JDK1.4.2中加入了對(duì)NIO的支持,掌握其中的Selector個(gè)人認(rèn)為是能實(shí)現(xiàn)好NIO的關(guān)鍵。

    Selector是用來(lái)獲取注冊(cè)在其中的channel的相關(guān)事件的發(fā)生,也就是accept,read和write。selector中有3個(gè)key set。

    key set:包含代表所有在其中注冊(cè)的channel,可以通過(guò)selector.keys()得到。
    selected-key set:包含所有被檢測(cè)到有關(guān)注的操作已經(jīng)就緒的key,通過(guò)selector.selectedKeys得到。
    cancelled-key set:包含所有已經(jīng)被cancel,但是還沒(méi)有channel還沒(méi)有deregister的key,這個(gè)集合是不能直接被訪問(wèn)的。

    key通過(guò)調(diào)用channel的register方法被加入到key set中。被取消的key在select的時(shí)候會(huì)被從相應(yīng)的key set中移除。

    key set自身是不可以直接進(jìn)行修改的。 無(wú)論是通過(guò)調(diào)用channel的close方法還是調(diào)用key的cancel方法,key都會(huì)被放置到canceled-key set中。取消的key會(huì)將其channel在下一次select時(shí)將注冊(cè)撤銷,同時(shí)將key從所有的key set中移除。

    key在執(zhí)行select操作時(shí)被加入到selected-key set中。在selected-key set中的key可以通過(guò)調(diào)用iterator的remove方法,將其從selected-key set中移除,不能通過(guò)其他的辦法將其從selected-key set中移除。

    通過(guò)selector的3個(gè)方法select(阻塞選擇,直到有關(guān)心的事件發(fā)生時(shí)退出阻塞),selectNow(不阻塞選擇),select(long)(指定超時(shí)選擇,超時(shí)到達(dá)或者有關(guān)心事件發(fā)生時(shí)退出阻塞),來(lái)獲取關(guān)心事件的發(fā)生。其執(zhí)行步驟分為以下3步:

    1、將存在于canceled-key set中的key從所有的key set中移除,撤銷注冊(cè)的channel,清空canceled-key set。
    2、地層操作系統(tǒng)檢查是否有關(guān)心的事件發(fā)生,當(dāng)有關(guān)心的事件發(fā)生時(shí),首先檢查channel的key是否已經(jīng)存在于selected-key set中,如果不存在,則將其加入到selected-key set中去,同時(shí)修改key的ready-operation set來(lái)表明當(dāng)前ready的操作,而以前存在于ready-operation set中的信息會(huì)被刪除。如果對(duì)應(yīng)的key已經(jīng)存在于selected-key set中,這直接修改其ready-operation set來(lái)表明當(dāng)前ready的操作,刪除原來(lái)ready-operation set中的信息。
    3、如果在第二步中有加入到canceled-key set中的key,在這一步會(huì)執(zhí)行第一步的操作。

    selector自身是線程安全的,而他的key set卻不是。在一次選擇發(fā)生的過(guò)程中,對(duì)于key的關(guān)心事件的修改要等到下一次select的時(shí)候才會(huì)生效。 另外,key和其代表的channel有可能在任何時(shí)候被cancel和close。因此存在于key set中的key并不代表其key是有效的,也不代表其channel是open的。如果key有可能被其他的線程取消或關(guān)閉channel,程序必須小 心的同步檢查這些條件。

    阻塞了的select可以通過(guò)調(diào)用selector的wakeup方法來(lái)喚醒。
    posted on 2005-04-26 10:06 非飛 閱讀(17394) 評(píng)論(3)  編輯  收藏 所屬分類: JAVA 相關(guān)技術(shù)

    FeedBack:
    # re: NIO中Selector的工作原理
    2005-04-29 15:50 | idior
    # re: NIO中Selector的工作原理
    2005-12-26 15:40 | zhangwei
    selector.selectedKeys返回是Set(應(yīng)該是集合的意思吧)但為什么返回值是int型匿?jdk上說(shuō)A selection key contains two operation sets represented as integer values. Each bit of an operation set denotes a category of selectable operations that are supported by the key's channel.它意思是說(shuō)一個(gè)整數(shù)(8bit)的每一個(gè)bit代表一個(gè)操作么?  回復(fù)  更多評(píng)論
      
    # re: NIO中Selector的工作原理
    2005-12-26 22:19 | zhangwei
    sorry, 我說(shuō)的是SelectionKey.interestOps  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 免费视频成人国产精品网站| 精品视频在线免费观看| 国产AⅤ无码专区亚洲AV| 免费萌白酱国产一区二区三区| 亚洲精品成人网站在线播放| 爽爽日本在线视频免费| 中文字幕av无码不卡免费 | 亚洲成a人片在线观看中文app| 女人被男人躁的女爽免费视频| 成人国产精品免费视频| 国产精品亚洲精品| 国产亚洲午夜高清国产拍精品| 国产精品免费观看| j8又粗又长又硬又爽免费视频| 亚洲精品欧洲精品| 国产91精品一区二区麻豆亚洲| 国产精品久久久久免费a∨| 国产免费一级高清淫曰本片| 77777亚洲午夜久久多喷| 欧洲亚洲国产清在高| 国产免费爽爽视频免费可以看| 6080午夜一级毛片免费看6080夜福利| 国产亚洲情侣久久精品| 亚洲成在人线中文字幕| 亚洲一区二区三区香蕉| 性做久久久久免费看| 最近高清中文字幕无吗免费看| 伊人免费在线观看| 极品色天使在线婷婷天堂亚洲| 亚洲国产精品久久丫| 久久亚洲国产午夜精品理论片| 亚洲国产成人久久一区久久| 一二三四免费观看在线电影| 久久久免费的精品| 黄床大片免费30分钟国产精品| 亚洲AV女人18毛片水真多| 亚洲三级在线免费观看| 水蜜桃亚洲一二三四在线| 亚洲中文字幕无码中文字在线| 一级毛片直播亚洲| 四虎永久免费观看|