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() 获取其 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() 返回一个操作集,标识此通道所支持的操作。 |
从类 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
- 如果 block 为 true 并且此通道已向一个或多个选择器注册IOException
- 如果发生 I/O 错误
isBlocking
public abstract boolean isBlocking()
- 判断此通道上的每个 I/O 操作在完成前是否被阻塞。新创建的通道总是处于阻塞模式。
如果此通道已关闭,则此方法返回的值是未指定的。
-
-
- 返回:
- 当且仅当此通道处于阻塞模式时才返回 true
blockingLock
public abstract Object blockingLock()
- 获取其 configureBlocking 和 register 方法实现同步的对象。在要求在短时间内维持特定阻塞模式的适配器实现中,这通常是很有用的。
-
-
- 返回:
- 阻塞模式锁定对象