posts - 16,comments - 17,trackbacks - 0
          @ My Space
          posted @ 2005-05-13 00:08 非飛 閱讀(2468) | 評論 (2)編輯 收藏
          @ My space
          posted @ 2005-05-07 00:19 非飛 閱讀(2232) | 評論 (0)編輯 收藏
          在JDK1.4.2中加入了對NIO的支持,掌握其中的Selector個人認為是能實現(xiàn)好NIO的關鍵。

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

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

          key通過調(diào)用channel的register方法被加入到key set中。被取消的key在select的時候會被從相應的key set中移除。

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

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

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

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

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

          阻塞了的select可以通過調(diào)用selector的wakeup方法來喚醒。
          posted @ 2005-04-26 10:06 非飛 閱讀(17400) | 評論 (3)編輯 收藏
          主站蜘蛛池模板: 长海县| 东乡族自治县| 河间市| 云浮市| 湛江市| 全椒县| 乳源| 奉新县| 墨脱县| 绥芬河市| 和硕县| 新和县| 乌拉特中旗| 辉南县| 靖安县| 五常市| 平谷区| 银川市| 隆德县| 锦屏县| 南阳市| 保康县| 淄博市| 怀柔区| 随州市| 长泰县| 中西区| 大埔县| 高尔夫| 桃源县| 普兰县| 达拉特旗| 岐山县| 黄骅市| 光泽县| 昭觉县| 宜兰市| 盐山县| 华宁县| 开化县| 马尔康县|