SelectionKey API 用法

https://www.cnblogs.com/Free-Thinker/p/6231743.html

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章