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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【Netty】NIO 选择器 ( Selector ) 简介

發布時間:2025/6/17 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Netty】NIO 选择器 ( Selector ) 简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

        • I . 選擇器 ( Selector )
        • II . 選擇器 ( Selector ) 與 NIO 特性
        • III . 選擇器 ( Selector ) API 簡介
        • IV . SelectionKey 簡介
        • V . 選擇器 ( Selector ) 工作流程





I . 選擇器 ( Selector )



NIO ( 非阻塞 IO ) 使用單個線程管理多個 通道 ( Channel ) 就是通過 選擇器 ( Selector ) 實現的 ;


選擇器 ( Selector ) 簡介 :


① 注冊機制 : 選擇器 ( Selector ) 可以注冊多個 通道 ( Channel ) , 注冊過程是以事件的方式進行注冊 , 如果有事件觸發 , 那么 選擇器 ( Selector ) 就會針對該事件類型進行對應處理 ;

② 注冊后的操作 : 通道 注冊給 選擇器 之后 , 每個線程對應的 選擇器 ( Selector ) 才能監控客戶端向服務器中對應的 通道 ( Channel ) 寫出的數據 ;

③ 輪詢機制 : 選擇器 ( Selector ) 工作時 , 不停地在輪詢其所注冊的 通道 ( Channel ) , 處理該 通道 所注冊的對應事件 ;

④ 非阻塞機制 : 只有 客戶端連接 有數據寫入時 , 才會觸發事件 , 線程才開始處理該客戶端對應的操作 , 如果沒有數據寫入 , 線程也不會在此阻塞 , 轉而處理其它事務 ;





II . 選擇器 ( Selector ) 與 NIO 特性



選擇器 ( Selector ) 與 NIO 特性 :


① 多路復用 : 選擇器 ( Selector ) 又稱為 多路復用器 , 為服務器的一個線程管理多個客戶端連接 ;

② 輪詢機制 : 客戶端通過 Socket 向服務器發送數據 , 被 選擇器 ( Selector ) 輪詢到 , 線程就會開始為該客戶端服務 ;

③ 單線程多個連接 : 如果 該客戶端 沒有發送數據 , 線程不會在此阻塞 , 線程會為其它的客戶端服務 , 因此一個線程可以管理與多個客戶端的連接 ;

④ 非阻塞 : 服務器端 的線程 不會因為客戶端沒有發送數據而阻塞 , 因此稱為 非阻塞 IO , 該機制提升了線程的 IO 效率 ;

⑤ 優點 : 服務器端單個線程可以非阻塞地并發處理與多個客戶端連接的讀寫操作 , 提高了系統的 可伸縮性 , 性能 ;





III . 選擇器 ( Selector ) API 簡介



選擇器 ( Selector ) 是 NIO 中的三大核心組件之一 ;


下面是 Selector API 相關簡介 ;


1 . Selector 抽象類 說明 : Selector 是一個抽象類 , 其中定義了 打開 , 關閉 , 選擇 , 鍵集 ( SelectionKey ) 相關的方法 ;

public abstract class Selector

2 . 打開 關閉 選擇器 ( Selector ) 相關方法 :


① Selector open() 方法 : 打開選擇器 , 作用是獲取一個選擇器 ;

② boolean isOpen() 方法 : 判定選擇器是否已經打開 ;

③ void close() 方法 : 關閉選擇器 ;


3 . 選擇 相關方法 : 監聽通道事件 , 如果有事件發生 , 返回發生的事件個數 ;


① int select(long timeout) 方法 : 開始監控該 選擇器 ( Selector ) 所注冊的 通道 ( Channel ) , 如果某個 通道中有 IO 操作觸發 , 將 通道 ( Channel ) 對應的 選擇鍵 ( SelectionKey ) 加入到其待處理集合中 ;

  • long timeout 參數 : 設置的超時時間 ;

② int select() 方法 : 監聽通道事件 , 如果有事件發生 , 返回發生的事件個數 , 如果沒有事件發生會一直保持阻塞 ;

③ int selectNow() 方法 : 監聽通道事件 , 如果有事件發生 , 返回發生的事件個數 , 如果沒有事件發生 , 返回 0 ;


4 . 選擇操作的阻塞說明 :


① 阻塞 : 選擇器 ( Selector ) 的 select() 方法執行的是 阻塞 操作 , 直到其所關聯的 通道 ( Channel ) 有一個有事件發生 ;

② 帶超時的阻塞 : 選擇器 ( Selector ) 的 select(long timeout) 方法 是阻塞 操作 , 但是如果 timeout 毫秒內沒有事件發生 , 就解除阻塞 ;

③ 非阻塞 : 選擇器 ( Selector ) 的 selectNow() 方法是 非阻塞的操作 , 如果當前沒有事件發生 , 立刻返回 , 有事件發生將 SelectionKey 放入集合再返回 , 總之不阻塞 ;


5 . 阻塞 喚醒相關方法 :

Selector wakeup() 方法 : 如果 選擇器 ( Selector ) 調用了 select() 方法 或 select(long timeout) 方法 , 當前處于阻塞狀態 , 那么就會立刻解除阻塞 ;


6 . 鍵集 相關方法 :


① Set<SelectionKey> selectedKeys() 方法 : 獲取 選擇器 ( Selector ) 所有有事件發生的通道的 SelectionKey 集合 , 上面的 select() 方法只能選擇一個 ;

② Set<SelectionKey> keys() 方法 : 獲取 選擇器 ( Selector ) 所注冊的有的通道的 SelectionKey ;





IV . SelectionKey 簡介



SelectionKey 簡介 :


① SelectionKey 作用 : SelectorImpl 是 Selector 的實現類 , 在其中可以看到很多 SelectionKey 的 Set 集合 ;

② SelectionKey 集合 : 存儲有事件發生的 通道 ( Channel ) 對應的 SelectionKey ;

public abstract class SelectorImpl extends AbstractSelector {protected Set<SelectionKey> selectedKeys = new HashSet();protected HashSet<SelectionKey> keys = new HashSet();private Set<SelectionKey> publicKeys;private Set<SelectionKey> publicSelectedKeys;... }

③ 通道 注冊給 選擇器 : 通道 ( Channel ) 注冊到 選擇器 ( Selector ) 中 , 每個 通道 ( Channel ) 都有一個對應的 SelectionKey ;

④ 事件觸發機制 : 選擇器 ( Selector ) 監控到某通道有事件發生 , 就會拿到該通道對應發生的事件的 個數 , 之后處理事件時 , 再去遍歷 SelectionKey 集合 , 通過 SelectionKey 可以獲取對應的 通道 ( Channel ) , 線程開始為該 通道 ( Channel ) 進行服務 ;

⑤ 通過 SelectionKey 獲取 通道 ( Channel ) : 在 SelectionKey 中定義了獲取 通道 的方法 , 可以直接獲取對應的通道 ;

public abstract SelectableChannel channel()

⑥ 獲取觸發事件的通道 : 調用 選擇器 ( Selector ) 的 select() 方法 , 就可以獲得有幾個 通道 ( Channel ) 中有事件發生 , 將有事件發生的 通道 的 SelectionKey 放入到集合中 ;

⑦ 觸發的事件 : 上述集合中每個 SelectionKey 都代表一個對應 通道 ( Channel ) 的事件 , 如 : 客戶端 TCP 連接 , 讀取數據 , 寫出數據 等事件 ;





V . 選擇器 ( Selector ) 工作流程



1 . 創建通道 : 服務器端 , 每當有客戶端連接服務器時 , 服務器的 ServerSocketChannel 就會創建一個與客戶端對應的 SocketChannel ;


2 . 注冊通道 : 將創建的 SocketChannel 注冊給 選擇器 ( Selector ) , 調用通道的 register() 方法將 通道 ( Channel ) 注冊給選擇器 ( Selector ) ;


① 注冊對應關系 : 一個 選擇器 ( Selector ) 可以注冊多個 通道 ( Channel ) ;

② 注冊返回值 : 通道 注冊給 選擇器 后 , 會返回 SelectionKey , 此時將 SelectionKey 放入 選擇器 ( Selector ) 的集合中進行管理 , 調用 選擇器的 keys() 方法 , 可以獲取這些注冊的 SelectionKey 的 Set 集合 ;

③ 常用的注冊方法 : ops 指的是關注的事件 ;

SelectionKey register(Selector sel, int ops) SelectionKey register(Selector sel, int ops, Object att)

3 . 選擇器 ( Selector ) 開始監聽 : 調用 select() , select(long timeout) , selectNow() 方法 , 以 阻塞或非阻塞 的方式獲取其管理的通道中 , 有幾個通道觸發了事件 ;


事件的種類 :

  • OP_READ : 讀取數據事件 ;
  • OP_WRITE : 寫出數據事件 ;
  • OP_CONNECT : 連接操作事件 ;
  • OP_ACCEPT : 等待連接操作事件 ;

4 . 獲取 SelectionKey : 獲取有事件發生的 通道 ( Channel ) 的 SelectionKey ;


5 . 獲取 SelectionKey 對應的通道 : 調用 SelectionKey 的 channel() 方法 , 可以獲取 SelectionKey 對應的 通道 ( Channel ) ;


6 . 通道 ( Channel ) 處理 : 執行真正的業務處理流程 ;

總結

以上是生活随笔為你收集整理的【Netty】NIO 选择器 ( Selector ) 简介的全部內容,希望文章能夠幫你解決所遇到的問題。

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