java SelectableChannel虚拟类

总结

  1. SelectableChannel虚拟类是一种可通过Selector多路复用的通道,为了与选择器一起使用,必须首先通过register方法注册此类的实例。此方法返回一个新的SelectionKey对象,该对象表示频道在选择器中的注册,一旦向选择器注册,通道将保持注册状态,直到取消注册为止。这涉及取消选择器分配给通道的任何资源
  2. 通道不能直接注销,相反,代表其注册的密钥SelectionKey必须被取消。取消一个键要求在选择器的下一个选择操作期间取消注册通道。可以通过调用SelectionKey#cancel()方法显式取消键。当通道关闭时,无论是通过调用其Channel#close方法还是通过中断在通道上的I/O操作中阻塞的线程, 都会隐式取消通道的所有密钥
  3. 如果选择器Selector本身关闭,则通道将取消注册,表示其注册的密钥将立即失效。一个通道最多可以向任何特定选择器注册一次,可以通过调用isRegistered方法来确定是否向一个或多个选择器注册了通道。SelectableChannel可供多个并发线程安全使用
  4. SelectableChannel可以处于阻塞模式或非阻塞模式。在阻塞模式下,在通道上调用的每个I/O操作都将阻塞,直到完成为止。 在非阻塞模式下,I/O操作将永远不会阻塞,并且可能传输的字节数少于请求的字节数, 或者可能根本没有字节。可选择通道的阻塞模式可通过调用其isBlocking方法来确定
  5. 新创建的SelectableChannel始终处于阻塞模式,非阻塞模式与基于选择器的多路复用结合使用最为有用,在向选择器注册之前,通道必须置于非阻塞模式,并且在取消注册之前不得返回到阻塞模式

SelectableChannel虚拟类方法

方法名作用
abstract SelectorProvider provider()返回创建此通道的提供程序
abstract int validOps()返回标识此通道支持的操作的操作集,在此整数值中设置的位正好表示对此通道有效的操作,对于给定的具体通道类,此方法始终返回相同的值,此操作值含义具体在SelectionKey虚拟类中
abstract boolean isRegistered()判断此通道当前是否已向任何选择器注册,新创建的频道是未注册的
abstract SelectionKey keyFor(Selector sel)获取表示通道在给定选择器Selector中注册的密钥SelectionKey
abstract SelectionKey register(Selector sel, int ops, Object att)在给定选择器上注册此通道,并返回选择键SelectionKey, ops为兴趣集,即该通道感兴趣的事件,如连接建立事件,att是附件,放在SelectionKey中,方便以后取出来使用
final SelectionKey register(Selector sel, int ops)在给定选择器上注册此通道,并返回选择键,使用 register(Selector sel, int ops, Object att)实现只是传入的附件为null
abstract SelectableChannel configureBlocking(boolean block)调整此通道的阻塞模式,如果此通道已向一个或多个选择器注册,则尝试将其置于阻塞模式将导致抛出IllegalBlockingModeException
abstract boolean isBlocking()判断此通道上是否是阻塞模式,即通道上的每个I/O操作都将阻塞,新创建的通道默认为阻塞模式

register(Selector sel, int ops, Object att)方法详解

  1. 如果此通道当前已向给定选择器注册,则返回表示该注册的选择键SelectionKey。键的兴趣集将被更改为ops,就像调用SelectionKey#interestOps(int)方法一样。如果att参数不是null,则键的附件将被设置为该值。如果密钥SelectionKey已被取消,将抛出CancelledKeyException
  2. 如果该通道尚未向给定选择器注册,因此将注册该通道,并返回生成的新密钥。密钥的初始兴趣集为ops,其附件为att
  3. 可以随时调用此方法。如果在进行选择操作时调用此方法,则它对该操作没有影响, 下一次选择操作将看到密钥兴趣集的新注册或更改。如果在调用configureBlocking(boolean)的过程中调用此方法,则它将阻塞,直到调整通道的阻塞模式操作成功
  4. 如果此操作正在进行时关闭此通道,则此方法返回的密钥将被取消,因此无效

register方法可能引发的异常

异常名意义
ClosedChannelException如果通道关闭了
ClosedSelectorException如果选择器关闭了
IllegalBlockingModeException如果此通道处于阻塞模式,阻塞模式无法使用Selector选择器
IllegalSelectorException如果此通道不是由与给定选择器Selector相同的提供程序SelectorProvider创建的
CancelledKeyException如果此通道当前已在给定选择器中注册,但相应的键SelectionKey已被取消
IllegalArgumentException如果ops集中的某个位与此通道支持的操作不对应,即set & ~validOps() != 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lolxxs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值