- java.lang.Object
-
- java.nio.channels.spi.AbstractInterruptibleChannel
-
- java.nio.channels.SelectableChannel
-
- 实现的所有接口
-
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
-
-
构造方法摘要
构造方法 变量 构造器 描述 protected
SelectableChannel()
初始化此类的新实例。
-
方法摘要
所有方法 实例方法 抽象方法 具体的方法 变量和类型 方法 描述 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 。-
声明方法的类 java.nio.channels.spi.AbstractInterruptibleChannel
begin, close, end, implCloseChannel
-
-
-
-
方法详细信息
-
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
- 如果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
方法同步的对象。 这通常适用于需要在短时间内维持特定阻塞模式的适配器。- 结果
- 阻塞模式锁定对象
-
-