JavaTM 2 Platform
Standard Ed. 6

java.nio.channels
類別 SelectableChannel

java.lang.Object
  繼承者 java.nio.channels.spi.AbstractInterruptibleChannel
      繼承者 java.nio.channels.SelectableChannel
所有已實作的介面:
Closeable, Channel, InterruptibleChannel
直接已知子類別:
AbstractSelectableChannel

public abstract class SelectableChannel
extends AbstractInterruptibleChannel
implements Channel

可通過 Selector 實作多路傳輸的通道。

為了與選擇器一起使用,此類別的實例必須首先通過 register 方法進行註冊。此方法返回一個表示該通道已向選擇器註冊的新 SelectionKey 物件。

向選擇器註冊後,通道在註銷 之前將保持註冊狀態。註銷涉及釋放選擇器已分派給該通道的所有資源。

不能直接註銷通道;相反,必須取消 表示通道註冊的鍵。取消某個鍵要求在選擇器的下一個選擇操作期間註銷通道。可通過調用某個鍵的 cancel 方法顯式地取消該鍵。無論是通過調用通道的 close 方法,還是中斷阻塞於該通道上 I/O 操作中的執行緒來關閉該通道,都會隱式地取消該通道的所有鍵。

如果選擇器本身已關閉,則將註銷該通道,並且表示其註冊的鍵將立即無效。

一個通道至多只能在任意特定選擇器上註冊一次。

可通過調用 isRegistered 方法來確定是否向一個或多個選擇器註冊了某個通道。

多個共時執行緒可安全地使用可選擇的通道。

阻塞網要

可選擇的通道要麼處於阻塞 網要,要麼處於非阻塞 網要。在阻塞網要中,每一個 I/O 操作完成之前都會阻塞在其通道上調用的其他 I/O 操作。在非阻塞網要中,永遠不會阻塞 I/O 操作,並且傳輸的位元組可能少於請求的數量,或者可能根本不傳輸位元組。可通過調用可選擇通道的
isBlocking 方法來確定其阻塞網要。

新創建的可選擇通道總是處於阻塞網要。在結合使用基於選擇器的多路傳輸時,非阻塞網要是最有用的。向選擇器註冊某個通道前,必須將該通道置於非阻塞網要,並且在註銷之前可能無法返回到阻塞網要。

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

建構子摘要
protected SelectableChannel()
          初始化此類別的一個新實例。
 
方法摘要
abstract  Object blockingLock()
          獲取其 configureBlockingregister 方法實作同步的物件。
abstract  SelectableChannel configureBlocking(boolean block)
          調整此通道的阻塞網要。
abstract  boolean isBlocking()
          判斷此通道上的每個 I/O 操作在完成前是否被阻塞。
abstract  boolean isRegistered()
          判斷此通道當前是否已向任何選擇器註冊。
abstract  SelectionKey keyFor(Selector sel)
          獲取表示通道向給定選擇器註冊的鍵。
abstract  SelectorProvider provider()
          返回創建此通道的提供者。
 SelectionKey register(Selector sel, int ops)
          向給定的選擇器註冊此通道,返回一個選擇鍵。
abstract  SelectionKey register(Selector sel, int ops, Object att)
          向給定的選擇器註冊此通道,返回一個選擇鍵。
abstract  int validOps()
          返回一個操作集,標識此通道所支持的操作。
 
從類別 java.nio.channels.spi.AbstractInterruptibleChannel 繼承的方法
begin, close, end, implCloseChannel, isOpen
 
從類別 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
從介面 java.nio.channels.Channel 繼承的方法
close, isOpen
 

建構子詳細資訊

SelectableChannel

protected SelectableChannel()
初始化此類別的一個新實例。

方法詳細資訊

provider

public abstract SelectorProvider provider()
返回創建此通道的提供者。

返回:
創建此通道的提供者

validOps

public abstract int validOps()
返回一個操作集,標識此通道所支持的操作。此整數值中設置的各位正好表示對此通道有效的操作。對於給定的具體通道類別,此方法始終返回相同的值。

返回:
有效操作集

isRegistered

public abstract boolean isRegistered()
判斷此通道當前是否已向任何選擇器註冊。新創建的通道總是未註冊的。

由於鍵取消和通道註銷之間固有的延遲,所以在已取消某個通道的所有鍵後,該通道可能在一定時間內還會保持已註冊狀態。關閉通道後,該通道可能在一定時間內還會保持已註冊狀態。

返回:
當且僅當此通道為已註冊時才返回 true

keyFor

public abstract SelectionKey keyFor(Selector sel)
獲取表示通道向給定選擇器註冊的鍵。

返回:
當此通道是向給定選擇器註冊的最後一個通道時返回該鍵,如果此通道當前未向該選擇器註冊,則返回 null

register

public abstract SelectionKey register(Selector sel,
                                      int ops,
                                      Object att)
                               throws ClosedChannelException
向給定的選擇器註冊此通道,返回一個選擇鍵。

如果當前已向給定的選擇器註冊了此通道,則返回表示該註冊的選擇鍵。該鍵的相關操作集將更改為 ops,就像調用 interestOps(int) 方法一樣。如果 att 參數不為 null,則將該鍵的附件設置為該值。如果已取消該鍵,則拋出 CancelledKeyException

如果尚未向給定的選擇器註冊此通道,則註冊該通道並返回得到的新鍵。該鍵的初始可用操作集是 ops,並且其附件是 att

可在任意時間調用此方法。如果調用此方法的同時正在進行另一個此方法或 configureBlocking 方法的調用,則在另一個操作完成前將首先阻塞該調用。然後此方法將在選擇器的鍵集上實作同步,因此如果調用此方法時共時地調用了涉及同一選擇器的另一個註冊或選擇操作,則可能阻塞此方法的調用。

如果正在進行此操作時關閉了此通道,則此方法返回的鍵是已取消的,因此返回鍵無效。

參數:
sel - 要向其註冊此通道的選擇器
ops - 所得鍵的可用操作集
att - 所得鍵的附件,可能為 null
返回:
表示此通道向給定選擇器註冊的鍵
拋出:
ClosedChannelException - 如果此通道已關閉
IllegalBlockingModeException - 如果此通道處於阻塞網要
IllegalSelectorException - 如果此通道與給定的選擇器不是由相同的提供者創建的
CancelledKeyException - 如果此通道當前已向給定的選擇器註冊,但是相應的鍵已經被取消
IllegalArgumentException - 如果 ops 集的某個位不對應於此通道所支持的某個操作,也就是說,如果 set & ~validOps() != 0

register

public final SelectionKey register(Selector sel,
                                   int ops)
                            throws ClosedChannelException
向給定的選擇器註冊此通道,返回一個選擇鍵。

調用此便捷方法的形式為

sc.register(sel, ops)
與下列方法調用完全相同:
sc.register(sel, ops, null)

參數:
sel - 要向其註冊此通道的選擇器
ops - 所得鍵的可用操作集
返回:
表示此通道向給定選擇器註冊的鍵
拋出:
ClosedChannelException - 如果此通道已關閉
IllegalBlockingModeException - 如果此通道處於阻塞網要
IllegalSelectorException - 如果此通道與給定的選擇器不是由相同的提供者創建的
CancelledKeyException - 如果此通道當前已向給定的選擇器註冊,但是相應的鍵已經被取消
IllegalArgumentException - 如果 ops 集的某個位不對應於此通道所支持的某個操作,也就是說,如果 set & ~validOps() != 0

configureBlocking

public abstract SelectableChannel configureBlocking(boolean block)
                                             throws IOException
調整此通道的阻塞網要。

如果向一個或多個選擇器註冊了此通道,則嘗試將此通道置於阻塞網要將導致拋出 IllegalBlockingModeException

可在任意時間調用此方法。新的阻塞網要僅影響在此方法返回後發起的 I/O 操作。對於某些實作而言,這可能需要在所有掛起的 I/O 操作完成之前阻塞其他操作。

如果調用此方法的同時正在進行另一個此方法或 register 方法的調用,則在另一個操作完成前將首先阻塞該調用。

參數:
block - 如果為 true,則此通道將被置於阻塞網要;如果為 false,則此通道將被置於非阻塞網要
返回:
此可選擇通道
拋出:
ClosedChannelException - 如果此通道已關閉
IllegalBlockingModeException - 如果 blocktrue 並且此通道已向一個或多個選擇器註冊
IOException - 如果發生 I/O 錯誤

isBlocking

public abstract boolean isBlocking()
判斷此通道上的每個 I/O 操作在完成前是否被阻塞。新創建的通道總是處於阻塞網要。

如果此通道已關閉,則此方法返回的值是未指定的。

返回:
當且僅當此通道處於阻塞網要時才返回 true

blockingLock

public abstract Object blockingLock()
獲取其 configureBlockingregister 方法實作同步的物件。在要求在短時間內維持特定阻塞網要的適配器實作中,這通常是很有用的。

返回:
阻塞網要鎖定物件

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

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