java.nio.channels
類 SelectionKey
java.lang.Object
java.nio.channels.SelectionKey
- 直接已知子類:
- AbstractSelectionKey
public abstract class SelectionKeyextends Object
表示 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 集合值。
- 從以下版本開始:
- 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()) != 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
- 如果已取消此鍵
attach
public final Object attach(Object ob)
-
將給定的對象附加到此鍵。
之后可通過 attachment 方法獲取已附加的對象。一次只能附加一個對象;調用此方法會導致丟棄所有以前的附加對象。通過附加 null 可丟棄當前的附加對象。
-
- 參數:
-
ob
- 要附加的對象,可以為 null - 返回:
- 先前已附加的對象(如果有),否則返回 null
attachment
public final Object attachment()
- 獲取當前的附加對象。
-
- 返回:
- 當前已附加到此鍵的對象,如果沒有附加對象,則返回 null