JavaTM 2 Platform
Standard Ed. 6

java.nio.channels
類別 SelectionKey

java.lang.Object
  繼承者 java.nio.channels.SelectionKey
直接已知子類別:
AbstractSelectionKey

public abstract class SelectionKey
extends Object

表示 SelectableChannelSelector 中的註冊的標記。

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

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

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

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

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

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

從以下版本開始:
1.4
另請參見:
SelectableChannel, Selector

欄位摘要
static int OP_ACCEPT
          用於Socket接受操作的操作集位。
static int OP_CONNECT
          用於Socket連接操作的操作集位。
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()
          測試此鍵的通道是否已準備好接受新的Socket連接。
 boolean isConnectable()
          測試此鍵的通道是否已完成其Socket連接操作。
 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
用於Socket連接操作的操作集位。

假定在選擇操作開始時,選擇鍵的 interest 集合中已包含 OP_CONNECT。如果選擇器檢測到相應的Socket通道已為完成其連接序列而準備就緒,或者有一個掛起的錯誤,那麼它會向該鍵的 ready 集合中添加 OP_CONNECT,並將該鍵添加到已選擇鍵集中。

另請參見:
常數欄位值

OP_ACCEPT

public static final int OP_ACCEPT
用於Socket接受操作的操作集位。

假定在選擇操作開始時,選擇鍵的 interest 集合中已包含 OP_ACCEPT。如果選擇器檢測到相應的伺服器Socket通道已為接受另一個連接而準備就緒,或者有一個掛起的錯誤,那麼它會向該鍵的 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()
測試此鍵的通道是否已完成其Socket連接操作。

調用此方法的形式為 k.isConnectable() ,該調用與以下調用的作用完全相同:

 k.readyOps() & OP_CONNECT != 0

如果此鍵的通道不支持Socket連接操作,則此方法始終返回 false

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

isAcceptable

public final boolean isAcceptable()
測試此鍵的通道是否已準備好接受新的Socket連接。

調用此方法的形式為 k.isAcceptable() 形式,該調用與以下調用的作用完全相同:

 k.readyOps() & OP_ACCEPT != 0

如果此鍵的通道不支持Socket接受操作,則此方法始終返回 false

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

attach

public final Object attach(Object ob)
將給定的物件附加到此鍵。

之後可通過 attachment 方法獲取已附加的物件。一次只能附加一個物件;調用此方法會導致丟棄所有以前的附加物件。通過附加 null 可丟棄當前的附加物件。

參數:
ob - 要附加的物件,可以為 null
返回:
先前已附加的物件(如果有),否則返回 null

attachment

public final Object attachment()
獲取當前的附加物件。

返回:
當前已附加到此鍵的物件,如果沒有附加物件,則返回 null

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only