1. 程式人生 > >Java NIO之SelectionKey類

Java NIO之SelectionKey類

SelectionKey類

簡介:

表示 SelectableChannel 在 Selector 中的註冊的標記。

每次向選擇器註冊通道時就會建立一個選擇鍵。通過呼叫某個鍵的 cancel 方法、關閉其通道,或者通過關閉其選擇器來取消 該鍵之前,它一直保持有效。取消某個鍵不會立即從其選擇器中移除它;相反,會將該鍵新增到選擇器的已取消鍵集,以便在下一次進行選擇操作時移除它。可通過呼叫某個鍵的 isValid 方法來測試其有效性。

選擇鍵包含兩個表示為整數值的操作集。操作集的每一位都表示該鍵的通道所支援的一類可選擇操作。

interest 集合 確定了下一次呼叫某個選擇器的選擇方法時,將測試哪類操作的準備就緒資訊。建立該鍵時使用給定的值初始化 interest 集合;之後可通過 interestOps(int) 方法對其進行更改。

ready 集合 標識了這樣一類操作,即某個鍵的選擇器檢測到該鍵的通道已為此類操作準備就緒。建立該鍵時 ready 集合被初始化為零;可以在之後的選擇操作中通過選擇器對其進行更新,但不能直接更新它。

選擇鍵的 ready 集合指示,其通道對某個操作類別已準備就緒,該指示只是一個提示,並不保證執行緒可執行此類別中的操作而不導致被阻塞。ready 集合很可能一完成選擇操作就是準確的。ready 集合可能由於外部事件和在相應通道上呼叫的 I/O 操作而變得不準確。

此類定義了所有已知的操作集位 (operation-set bit),但是給定的通道具體支援哪些位則取決於該通道的型別。SelectableChannel 的每個子類都定義了 validOps() 方法,該方法返回的集合恰好標識該通道支援的操作。試圖設定或測試某個鍵的通道所不支援的操作集位將導致丟擲相應的執行時異常。

通常必須將某個特定於應用程式的資料與某個選擇鍵相關聯,例如表示高階協議狀態的物件和為了實現該協議而處理準備就緒通知的物件。因此,選擇鍵支援將單個任意物件附加 到某個鍵的操作。可通過 attach 方法附加物件,然後通過 attachment 方法獲取該物件。

多個併發執行緒可安全地使用選擇鍵。一般情況下,讀取和寫入 interest 集合的操作將與選擇器的某些操作保持同步。具體如何執行該同步與實現有關:在一般實現中,如果正在進行某個選擇操作,那麼讀取或寫入 interest 集合可能會無限期地阻塞;在高效能的實現中,可能只會暫時阻塞。無論在哪種情況下,選擇操作將始終使用該操作開始時當前的 interest 集合值。

主要方法

attach
public final Object attach(Object ob)將給定的物件附加到此鍵。 
之後可通過 attachment 方法獲取已附加的物件。一次只能附加一個物件;呼叫此方法會導致丟棄所有以前的附加物件。通過附加 null 可丟棄當前的附加物件。 


引數:
ob - 要附加的物件,可以為 null 
返回:
先前已附加的物件(如果有),否則返回 null
attachment
public final Object attachment()獲取當前的附加物件。 


返回:
當前已附加到此鍵的物件,如果沒有附加物件,則返回 null
channel
public abstract SelectableChannel channel()返回為之建立此鍵的通道。即使已取消該鍵,此方法仍繼續返回通道。 


返回:
此鍵的通道
selector
public abstract Selector selector()返回為此選擇器建立的鍵。即使已取消該鍵後,此方法仍將繼續返回選擇器。 


返回:
此鍵的選擇器
interestOps
public abstract SelectionKey interestOps(int ops)將此鍵的 interest 集合設定為給定值。 
可在任意時間呼叫此方法。是否受阻塞,以及阻塞時間長短都是與實現相關的。 


引數:
ops - 新的 interest 集合 
返回:
此選擇鍵 
丟擲: 
IllegalArgumentException - 如果集合中的某個位與此鍵的通道所支援的某個操作不對應,也就是說,如果 set & ~(channel().validOps()) != 0 
CancelledKeyException - 如果已取消此鍵
readyOps
public abstract int readyOps()獲取此鍵的 ready 操作集合。 
可保證返回的集合僅包含對於此鍵的通道而言有效的操作位。 


返回:
此鍵的 ready 操作集合 
丟擲: 
CancelledKeyException - 如果已取消此鍵
isReadable
public final boolean isReadable()測試此鍵的通道是否已準備好進行讀取。 
呼叫此方法的形式為 k.isReadable() ,該呼叫與以下呼叫的作用完全相同: 

 k.readyOps() & OP_READ != 0如果此鍵的通道不支援讀取操作,則此方法始終返回 false。 


返回:
當且僅當 readyOps() & OP_READ 為非零值時才返回 true 
丟擲: 
CancelledKeyException - 如果已取消此鍵
isWritable
public final boolean isWritable()測試此鍵的通道是否已準備好進行寫入。 
呼叫此方法的形式為 k.isWritable() ,該呼叫與以下呼叫的作用完全相同: 

 k.readyOps() & OP_WRITE != 0如果此鍵的通道不支援寫入操作,則此方法始終返回 false。 


返回:
當且僅當 readyOps() & OP_WRITE 為非零值時才返回 true 
丟擲: 
CancelledKeyException - 如果已取消此鍵
isConnectable
public final boolean isConnectable()測試此鍵的通道是否已完成其套接字連線操作。 
呼叫此方法的形式為 k.isConnectable() ,該呼叫與以下呼叫的作用完全相同: 

 k.readyOps() & OP_CONNECT != 0如果此鍵的通道不支援套接字連線操作,則此方法始終返回 false。 


返回:
當且僅當 readyOps() & OP_CONNECT 為非零值時才返回 true 
丟擲: 
CancelledKeyException - 如果已取消此鍵
isAcceptable
public final boolean isAcceptable()測試此鍵的通道是否已準備好接受新的套接字連線。 
呼叫此方法的形式為 k.isAcceptable() 形式,該呼叫與以下呼叫的作用完全相同: 

 k.readyOps() & OP_ACCEPT != 0如果此鍵的通道不支援套接字接受操作,則此方法始終返回 false。 


返回:
當且僅當 readyOps() & OP_ACCEPT 為非零值時才返回 true 
丟擲: 
CancelledKeyException - 如果已取消此鍵