天天看點

JavaSE:NIO - 選擇鍵(SelectionKey) & Selector的使用流程

1.  選擇鍵

    Channel 和 Selector的關系确定好後,并且一旦通道處于某種就緒狀态,就可以被選擇器查詢到。

         那麼,怎麼進行查詢呢?

      這個工作,使用選擇器Selector的select() 方法完成。 

      select()方法:對感興趣的通道操作,進行就緒狀态的查詢。

       

JavaSE:NIO - 選擇鍵(SelectionKey) & Selector的使用流程

      Selector可以不斷地查詢Channel中發生的操作的狀态。并且挑選感興趣的操作的就緒狀态。

      一旦通道有操作的就緒狀态達成,并且是Selector感興趣的操作,就會被Selector選中,放入選擇鍵集合中。

    select():  選擇器等待用戶端連接配接的方法             阻塞問題:               1. 在開始沒有客戶通路的時候,是阻塞的               2. 在有客戶來通路的時候,方法會變成非阻塞的               3. 如果客戶的通路,被處理結束之後,又會恢複成阻塞的     selectedKeys():   選擇器會把被連接配接的伺服器對象,放在Set集合中,這個方法就是傳回一個Set集合

2.  Selector的使用流程

      <1> 建立Selector

          Selector對象,是通過調用靜态工廠方法open(),來執行個體化的,如下:    

      <2>将Channel注冊到Selector

          要實作Selector管理Channel,需要将channel注冊到相應的Selector上:

  上面通過調用通道的register()方法,會将它注冊到一個選擇器上

  首先需要注意的是:

  與Selector一起使用時,Channel必須處于非阻塞模式下,否則将抛出異常IllegalBlockingModeException

3. 輪詢查詢就緒操作

  萬事俱備,下一步是查詢就緒的操作

  通過Selector的select()方法,可以查詢出已經就緒的通道操作,這些就緒的狀态集合,包存在一個元素是SelectionKey對象的Set集合中。

  select()方法傳回的int值,表示有多少通道已經就緒

JavaSE:NIO - 選擇鍵(SelectionKey) & Selector的使用流程

  而一旦調用select()方法, 并且傳回值不為0時,下一步該怎麼做?

   

  通過調用Selector的selectedKeys()方法,來通路已選擇鍵集合,然後疊代集合的每一個選擇鍵元素,根據就緒操作的類型,

  完成對應的操作(見下篇:NIO程式設計執行個體)。