- java.lang.Object
-
- java.nio.channels.spi.AbstractInterruptibleChannel
-
- java.nio.channels.SelectableChannel
-
- All Implemented Interfaces:
-
Closeable
,AutoCloseable
,Channel
,InterruptibleChannel
- 已知直接子类:
-
AbstractSelectableChannel
public abstract class SelectableChannel extends AbstractInterruptibleChannel implements Channel
可通过Selector
复用的通道 。为了与选择器一起使用,此类的实例必须首先通过
register
方法注册 。 此方法返回一个新的SelectionKey
对象,表示通道对选择器的注册。一旦注册了选择器,通道保持注册,直到它被注销 。 这包括通过选择器取消分配给频道的任何资源。
渠道不能直接注销; 而是代表其注册的密钥必须被取消 。 取消密钥请求在选择器的下一个选择操作期间注销通道。 可以通过调用其
cancel
方法明确地取消密钥。 无论通过调用其close
方法还是通过中断在通道上I / O操作中阻塞的线程,通道关闭时,所有通道的密钥都将被隐式取消。如果选择器本身被关闭,那么该通道将被注销,并且表示其注册的密钥将被无效,而不再延迟。
任何特定选择器最多可以注册一个通道。
可以通过调用
isRegistered
方法来确定频道是否向一个或多个选择器注册。可选择的通道可安全使用多个并发线程。
阻塞模式
可选通道处于阻塞模式或非阻塞模式。 在阻塞模式下,通道上调用的每个I / O操作将阻塞直到完成。 在非阻塞模式下,I / O操作将永远不会阻塞,并且可能会传输比所请求的字节更少的字节,或者根本没有字节。 可选择的信道的阻塞模式可以通过调用其isBlocking
方法来确定。新创建的可选通道始终处于阻止模式。 非阻塞模式与基于选择器的复用最为有用。 一个通道在被注册到选择器之前必须被置于非阻塞模式,并且在被注销之前可能不会返回到阻塞模式。
- 从以下版本开始:
- 1.4
- 另请参见:
-
SelectionKey
,Selector
-
-
构造方法摘要
构造方法 Modifier Constructor 描述 protected
SelectableChannel()
初始化此类的新实例。
-
方法摘要
所有方法 接口方法 抽象方法 具体的方法 Modifier and Type 方法 描述 abstract Object
blockingLock()
检索configureBlocking
和register
方法同步的对象。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()
返回一个 operation set标识该频道支持的操作。-
Methods inherited from class java.nio.channels.spi.AbstractInterruptibleChannel
begin, close, end, implCloseChannel, isOpen
-
-
-
-
方法详细信息
-
provider
public abstract SelectorProvider provider()
返回创建此通道的提供程序。- 结果
- 创建此频道的提供商
-
validOps
public abstract int validOps()
- 结果
- 有效操作集
-
isRegistered
public abstract boolean isRegistered()
告知这个频道当前是否在任何选择器上注册。 新创建的频道未注册。由于键取消和通道注销之间的固有延迟,在所有键被取消之后,频道可能会保留一段时间。 通道关闭后也可能会保留一段时间。
- 结果
-
true
如果,且仅当此频道注册
-
keyFor
public abstract SelectionKey keyFor(Selector sel)
检索表示频道注册的键与给定的选择器。- 参数
-
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
- 如果此通道关闭 -
ClosedSelectorException
- 如果选择器关闭 -
IllegalBlockingModeException
- 如果此通道处于阻塞模式 -
IllegalSelectorException
- 如果此通道不是由与给定选择器相同的提供程序创建的 -
CancelledKeyException
- 如果此通道当前已注册到给定的选择器,但相应的键已被取消 -
IllegalArgumentException
- 如果ops
集合中的某个位与此通道支持的操作不对应,即set & ~validOps() != 0
-
register
public final SelectionKey register(Selector sel, int ops) throws ClosedChannelException
- 参数
-
sel
- 要注册该频道的选择器 -
ops
- 为结果键设置的兴趣 - 结果
- 表示该通道与给定选择器的注册的键
- 异常
-
ClosedChannelException
- 如果此通道关闭 -
ClosedSelectorException
- 如果选择器关闭 -
IllegalBlockingModeException
- 如果此通道处于阻塞模式 -
IllegalSelectorException
- 如果此通道不是由与给定选择器相同的提供程序创建的 -
CancelledKeyException
- 如果此频道当前已向给定的选择器注册,但对应的密钥已被取消 -
IllegalArgumentException
- 如果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
- 如果block
是true
并且该信道被注册到一个或多个选择器 -
IOException
- 如果发生I / O错误
-
isBlocking
public abstract boolean isBlocking()
告诉这个通道上的每个I / O操作是否会阻塞直到完成。 新创建的通道始终处于阻止模式。如果此通道关闭,则此方法返回的值未指定。
- 结果
-
true
如果且仅当此通道处于阻止模式时
-
blockingLock
public abstract Object blockingLock()
检索configureBlocking
和register
方法同步的对象。 这在实现需要在短时间内保持特定阻塞模式的适配器通常是有用的。- 结果
- 阻塞模式锁定对象
-
-