日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

完全理解NIO Selector

發布時間:2025/3/15 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 完全理解NIO Selector 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Selector是什么

Selector是一個或多個SelectableChannel對象的多路復用器.

二、如何創建一個Selector對象

  • 一個selector對象可以通過調用Selector.open()來創建,這個工廠方法會使用系統默認的selector provider來創建一個新的selector對象。或者我們還可以通過實現抽象類SelectorProvider自定義一個selector provider,然后調用它的openSelector()來創建, 例如:new SelectorProviderImpl().openSelector()
  • 除非調用selector.close(),否則該selector將會一直保持打開狀態。
  • 三、如何將selectable channel注冊到selector中

    SelectionKey key = channel.register(selector,Selectionkey.XXX);
  • 通過channel的register方法,將channel注冊到給定的selector中,并返回一個表示注冊關系的SelectionKey對象。
  • 四、selector如何維護selection keys

    一個selector維護著三個selection keys集合:

  • key set包含著所有selectionKeys,當前所有注冊到selector中的channel返回的注冊關系SelectionKey都包含在內,這個集合可以通過selector.keys()方法返回。
  • selected-key set 包含著一部分selectionKeys,其中的每個selectionKey所關聯的channel在selectionoperation期間被檢測出至少準備好了一個可以在興趣集中匹配到的操作。這個集合可以通過調用selector.selectedKeys()方法返回。
  • selected-keyset 一定是 key set 的子集。 cancelled-key set也包含著一部分selectionKeys,其中的每個selectionKey都已經被取消,但是所關聯channel還沒有被撤銷登記。cancelled-key set 不能夠被直接返回,但也一定是 key set 的子集。
  • 對于一個新創建的selector其中這三個集合都是空著的。

  • 通過channel的register方法,一個selectionKey被增加到selector的 key set 中。
  • 無論通過channel.close()還是通過selectionKey.cancel()來取消一個selectionKey ,這個selectionKey都會被立即添加到selector的 cancelled-key set中,但是所關聯的channel并沒有立即被撤銷登記,直到發生下次 selection operations,這些channel才被從selector中撤銷登記,與此同時這些Cancelled keys才會被從這個selector的所有selectionKey set(可能是_key set_、selected-key set、cancelled-key set)中移除,但是不會影響這些集合本身。
  • 在 selection operations 期間,一些selectionKey會被選中添加到 selected-key set 中。其中的每個key可以通過selectiedKeys.remove()或selectiedKeys.iterator().remove()直接從 selected-key set 中移除,除此之外不能夠通過任何方式被直接移除。特殊的,selected-key set 中的keys還可以在 selection operations 期間被間接移除。但是是不可以直接向 selected-key set 添加key的。
  • 五、selector如何選擇就緒channel

    • 每次 selection operation 期間, keys都可以添加到或從selector’s selected-key set 被移除,同時也可- 以從它的 key 和 cancelled-key sets 被移除。 selection operation 可以被觸發通過執行selector.select(),selector.select(long),和selector.selectNow() 方法,并且這些方法涉及到以下三個步驟:
  • 首先每個位于 cancelled-key set
    中的key會從每個包含它的key集合中被移除,并且對應的channel會被撤銷登記。這個步驟使得 cancelled-key set
    變為空。

  • 查詢底層操作系統來獲得關于selector中剩余channel的就續事件從 selection operation
    開始截止到此刻的更新情況,只要哪個channel的就續事件的更新部分有至少一個與興趣集中的操作匹配上,那么將會執行以下兩個動作:

  • 如果這個channel’s key 沒有存在 于 selected-key set
    那么將它添加到這個集合中,并將它的就緒操作集(ready-operation set)修改成
    只包含使得channel被報告就緒的操作,任何先前記錄在就緒操作集中的就緒信息都會被丟棄。
  • 否則,如果這個channel’s key 存在 于 selected-key set ,那么就保留就緒操作集中先前的就緒信息,并將這些
    使得channel被報告就緒的操作 寫入進去;總而言之,系統底層會通過按位與&操作更新當前就緒集。
  • 如果這些Key的興趣集為空,那么 selected-key set 和 keys’的就續集(ready-operation
    sets)都不會被更新。
  • 如果在步驟(2)正在進行時將任何key添加到 cancelled-key set,則按步驟(1)處理它們。
    • selection operations 是否會阻塞等待一個或多個通道準備就緒,以及等待多長時間,這是三種選擇方法之間唯一的本質區別。

    六、selector線程安全嗎

    多線程并發情況下Selectors本身是線程安全的,但是他們所持有的key sets不是線程安全的。

    selection operations 按順序在selector本身,key set 和 selected-key set 上同步。 它們還在上面的步驟(1)和(3)期間在 canceled-key set 上同步。

    在 selection operations 期間改變key的興趣集,對于本次操作將不會產生任何影響;它們的影響將會在下次 selection operations 期間發生。

    selectionKey可能會被取消,channel可能隨時關閉。 因此,在一個或多個選擇器的key集中存在并不意味著selectionKey有效或其channel是開放的。有可能另一個線程取消selectionKey或關閉一個channel,應用程序代碼應該小心地同步并檢查這些條件。

    一個線程通過selector.select()或selector.select(long)方法產生的阻塞可以被其他線程用以下三種方式的任意一種來中斷:

  • By invoking the selector’s wakeup() method,

  • By invoking the selector’s close() method, or

  • By invoking the blocked thread’s interrupt() method, in which case itsinterrupt status will be set and the selector’s wakeup() method will
    be invoked.

  • selector.close() 在 selection operations 期間會順序的同步selectorand all three key sets 。

    一個selector的 key set 和 selected-key set 通常情況下是線程不安全的。如果一個線程想要修改這個集合,需要同步控制它。通過key集合的iterator()方法返回的Iterators提供了快速失敗(fail-fast):如果在創建迭代器之后修改了set,除了通過調用迭代器自己的remove() 方法之外,將拋出ConcurrentModificationException 。

    文章轉自

    總結

    以上是生活随笔為你收集整理的完全理解NIO Selector的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。