public abstract class SelectableChannel extends AbstractInterruptibleChannel implements Channel
Selector
复用的通道 。
为了与一个选择器被使用,这个类的一个实例必须首先经由注册 register
方法。 此方法返回一个新的SelectionKey
对象,表示通道与选择器的注册。
一旦注册了选择器,通道保持注册,直到它被注销 。 这包括通过选择器取消分配给频道的任何资源。
渠道不能直接注销; 而是代表其注册的密钥必须被取消 。 取消密钥请求在选择器的下一个选择操作期间注销通道。 可以通过调用其cancel
方法来明确地取消密钥。 无论通过调用其close
方法还是通过中断通道上的I / O操作中阻塞的线程,通道关闭时,所有通道的密钥都将被隐式取消。
如果选择器本身被关闭,那么该通道将被注销,并且表示其注册的密钥将被无效,而不再延迟。
任何特定选择器最多可以注册一个通道。
可以通过调用isRegistered
方法来确定信道是否被注册到一个或多个选择器。
可选择的通道可安全使用多个并发线程。
isBlocking
方法来确定 。
新创建的可选通道始终处于阻止模式。 非阻塞模式与基于选择器的复用最为有用。 在注册选择器之前,必须将通道置于非阻塞模式,并且在注销之前可能不会返回到阻止模式。
SelectionKey
, Selector
Modifier | Constructor and Description |
---|---|
protected |
SelectableChannel()
初始化此类的新实例。
|
Modifier and Type | Method and Description |
---|---|
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标识该频道支持的操作。
|
begin, close, end, implCloseChannel, isOpen
public abstract SelectorProvider provider()
public abstract int validOps()
public abstract boolean isRegistered()
由于键取消和通道注销之间的固有延迟,在所有键被取消之后,频道可能会保留一段时间。 通道关闭后也可能会保留一段时间。
public abstract SelectionKey keyFor(Selector sel)
sel
- 选择器
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
public final SelectionKey register(Selector sel, int ops) throws ClosedChannelException
sel
- 要注册该频道的选择器
ops
- 为结果键设置的兴趣
ClosedChannelException
- 如果此通道关闭
ClosedSelectorException
- 如果选择器关闭
IllegalBlockingModeException
- 如果此通道处于阻塞模式
IllegalSelectorException
- 如果此通道不是由与给定选择器相同的提供者创建的
CancelledKeyException
- 如果此通道当前已注册到给定的选择器,但相应的键已被取消
IllegalArgumentException
- 如果ops中的某位与此频道
支持的操作不对应,也就是说,如果
set & ~validOps() != 0
public abstract SelectableChannel configureBlocking(boolean block) throws IOException
如果该通道已经被一个或多个选择器注册,则尝试将其置于阻塞模式将导致抛出IllegalBlockingModeException
。
可以随时调用此方法。 新的阻塞模式将仅影响此方法返回后启动的I / O操作。 对于一些实现,这可能需要阻塞,直到所有待处理的I / O操作完成。
如果此方法被调用,而此方法或register
方法的另一个调用正在进行中,那么它将首先阻止,直到另一个操作完成。
block
- 如果true那么这个通道将被置于阻塞模式;
如果false那么它将被放置为非阻塞模式
ClosedChannelException
- 如果此频道关闭
IllegalBlockingModeException
- 如果
block是
true ,并且该通道被注册到一个或多个选择器
IOException
- 如果发生I / O错误
public abstract boolean isBlocking()
如果此通道关闭,则此方法返回的值未指定。
public abstract Object blockingLock()
configureBlocking
和register
方法同步的对象。
这在实现需要在短时间内保持特定阻塞模式的适配器通常是有用的。