SelectionKey API用法
java.nio.channels
類 SelectionKey
java.lang.Object java.nio.channels.SelectionKey
- 直接已知子類:
- AbstractSelectionKey
public abstract class SelectionKeyextends Object
表示 SelectableChannel 在 Selector 中的註冊的標記。
每次向選擇器註冊通道時就會建立一個選擇鍵。通過呼叫某個鍵的 cancel 方法、關閉其通道,或者通過關閉其選擇器來取消 該鍵之前,它一直保持有效。取消某個鍵不會立即從其選擇器中移除它;相反,會將該鍵新增到選擇器的
interest 集合 確定了下一次呼叫某個選擇器的選擇方法時,將測試哪類操作的準備就緒資訊。建立該鍵時使用給定的值初始化 interest 集合;之後可通過 interestOps(int) 方法對其進行更改。
ready 集合 標識了這樣一類操作,即某個鍵的選擇器檢測到該鍵的通道已為此類操作準備就緒。建立該鍵時 ready 集合被初始化為零;可以在之後的選擇操作中通過選擇器對其進行更新,但不能直接更新它。
選擇鍵的 ready 集合指示,其通道對某個操作類別已準備就緒,該指示只是一個提示,並不保證執行緒可執行此類別中的操作而不導致被阻塞。ready 集合很可能一完成選擇操作就是準確的。ready 集合可能由於外部事件和在相應通道上呼叫的 I/O 操作而變得不準確。
此類定義了所有已知的操作集位 (operation-set bit),但是給定的通道具體支援哪些位則取決於該通道的型別。SelectableChannel 的每個子類都定義了 validOps() 方法,該方法返回的集合恰好標識該通道支援的操作。試圖設定或測試某個鍵的通道所不支援的操作集位將導致丟擲相應的執行時異常。
通常必須將某個特定於應用程式的資料與某個選擇鍵相關聯,例如表示高階協議狀態的物件和為了實現該協議而處理準備就緒通知的物件。因此,選擇鍵支援將單個任意物件附加 到某個鍵的操作。可通過 attach 方法附加物件,然後通過 attachment 方法獲取該物件。
多個併發執行緒可安全地使用選擇鍵。一般情況下,讀取和寫入 interest 集合的操作將與選擇器的某些操作保持同步。具體如何執行該同步與實現有關:在一般實現中,如果正在進行某個選擇操作,那麼讀取或寫入 interest 集合可能會無限期地阻塞;在高效能的實現中,可能只會暫時阻塞。無論在哪種情況下,選擇操作將始終使用該操作開始時當前的 interest 集合值。
- 從以下版本開始:
- 1.4
- 另請參見:
- SelectableChannel, Selector
欄位摘要 | |
---|---|
static int |
OP_ACCEPT 用於套接字接受操作的操作集位。 |
static int |
OP_CONNECT 用於套接字連線操作的操作集位。 |
static int |
OP_READ 用於讀取操作的操作集位。 |
static int |
OP_WRITE 用於寫入操作的操作集位。 |
構造方法摘要 | |
---|---|
protected
|
SelectionKey() 構造此類的一個例項。 |
方法摘要 | |
---|---|
Object |
attach(Object ob) 將給定的物件附加到此鍵。 |
Object |
attachment() 獲取當前的附加物件。 |
abstract void |
cancel() 請求取消此鍵的通道到其選擇器的註冊。 |
abstract SelectableChannel |
channel() 返回為之建立此鍵的通道。 |
abstract int |
interestOps() 獲取此鍵的 interest 集合。 |
abstract SelectionKey |
interestOps(int ops) 將此鍵的 interest 集合設定為給定值。 |
boolean |
isAcceptable() 測試此鍵的通道是否已準備好接受新的套接字連線。 |
boolean |
isConnectable() 測試此鍵的通道是否已完成其套接字連線操作。 |
boolean |
isReadable() 測試此鍵的通道是否已準備好進行讀取。 |
abstract boolean |
isValid() 告知此鍵是否有效。 |
boolean |
isWritable() 測試此鍵的通道是否已準備好進行寫入。 |
abstract int |
readyOps() 獲取此鍵的 ready 操作集合。 |
abstract Selector |
selector() 返回為此選擇器建立的鍵。 |
從類 java.lang.Object 繼承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
欄位詳細資訊 |
---|
OP_READ
public static final int OP_READ
- 用於讀取操作的操作集位。
假定在選擇操作開始時,選擇鍵的 interest 集合中已包含 OP_READ。如果選擇器檢測到相應的通道已為讀取準備就緒、已經到達流的末尾、已經被遠端關閉而無法進行進一步的讀取,或者有一個掛起的錯誤,那麼它會向該鍵的 ready 集合中新增 OP_READ,並將該鍵新增到已選擇鍵集中。
- 另請參見:
- 常量欄位值
OP_WRITE
public static final int OP_WRITE
- 用於寫入操作的操作集位。
假定在選擇操作開始時,選擇鍵的 interest 集合中已包含 OP_WRITE。如果選擇器檢測到相應的通道已為寫入準備就緒、已經被遠端關閉而無法進行進一步的寫入,或者有一個掛起的錯誤,那麼它會向該鍵的 ready 集合中新增 OP_WRITE,並將該鍵新增到已選擇鍵集中。
- 另請參見:
- 常量欄位值
OP_CONNECT
public static final int OP_CONNECT
- 用於套接字連線操作的操作集位。
假定在選擇操作開始時,選擇鍵的 interest 集合中已包含 OP_CONNECT。如果選擇器檢測到相應的套接字通道已為完成其連線序列而準備就緒,或者有一個掛起的錯誤,那麼它會向該鍵的 ready 集合中新增 OP_CONNECT,並將該鍵新增到已選擇鍵集中。
- 另請參見:
- 常量欄位值
OP_ACCEPT
public static final int OP_ACCEPT
- 用於套接字接受操作的操作集位。
假定在選擇操作開始時,選擇鍵的 interest 集合中已包含 OP_ACCEPT。如果選擇器檢測到相應的伺服器套接字通道已為接受另一個連線而準備就緒,或者有一個掛起的錯誤,那麼它會向該鍵的 ready 集合中新增 OP_ACCEPT,並將該鍵新增到已選擇鍵集中。
- 另請參見:
- 常量欄位值
構造方法詳細資訊 |
---|
SelectionKey
protected SelectionKey()
- 構造此類的一個例項。
方法詳細資訊 |
---|
channel
public abstract SelectableChannel channel()
- 返回為之建立此鍵的通道。即使已取消該鍵,此方法仍繼續返回通道。
-
- 返回:
- 此鍵的通道
selector
public abstract Selector selector()
- 返回為此選擇器建立的鍵。即使已取消該鍵後,此方法仍將繼續返回選擇器。
-
- 返回:
- 此鍵的選擇器
isValid
public abstract boolean isValid()
- 告知此鍵是否有效。
鍵在建立時是有效的,並在被取消、其通道已關閉或者其選擇器已關閉之前保持有效。
-
- 返回:
- 當且僅當此鍵有效時才返回 true
cancel
public abstract void cancel()
- 請求取消此鍵的通道到其選擇器的註冊。一旦返回,該鍵就是無效的,並且將被新增到其選擇器的已取消鍵集中。在進行下一次選擇操作時,將從所有選擇器的鍵集中移除該鍵。
如果已取消了此鍵,則呼叫此方法無效。一旦取消某個鍵,該鍵會一直保持無效。
可在任意時間呼叫此方法。此方法與選擇器的已取消鍵集保持同步,因此如果通過涉及同一選擇器的取消或選擇操作併發呼叫它,則它可能會暫時受阻塞。
interestOps
public abstract int interestOps()
- 獲取此鍵的 interest 集合。
可保證返回的集合僅包含對於此鍵的通道而言有效的操作位。
可在任意時間呼叫此方法。是否受阻塞,以及阻塞時間長短都是與實現相關的。
-
- 返回:
- 此鍵的 interest 集合
- 丟擲:
CancelledKeyException
- 如果已取消此鍵
interestOps
public abstract SelectionKey interestOps(int ops)
- 將此鍵的 interest 集合設定為給定值。
可在任意時間呼叫此方法。是否受阻塞,以及阻塞時間長短都是與實現相關的。
-
- 引數:
ops
- 新的 interest 集合- 返回:
- 此選擇鍵
- 丟擲:
IllegalArgumentException
- 如果集合中的某個位與此鍵的通道所支援的某個操作不對應,也就是說,如果 set & ~(channel().validOps()) != 0CancelledKeyException
- 如果已取消此鍵
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
- 如果已取消此鍵
attach
public final Object attach(Object ob)
- 將給定的物件附加到此鍵。
之後可通過 attachment 方法獲取已附加的物件。一次只能附加一個物件;呼叫此方法會導致丟棄所有以前的附加物件。通過附加 null 可丟棄當前的附加物件。
-
- 引數:
ob
- 要附加的物件,可以為 null- 返回:
- 先前已附加的物件(如果有),否則返回 null
attachment
public final Object attachment()
- 獲取當前的附加物件。
-
- 返回:
- 當前已附加到此鍵的物件,如果沒有附加物件,則返回 null