Module java.base

Class SelectableChannel

所有已实现的接口:
Closeable, AutoCloseable, Channel, InterruptibleChannel
直接已知的子类:
AbstractSelectableChannel

public abstract class SelectableChannel extends AbstractInterruptibleChannel implements Channel
可通过Selector进行多路复用的通道。

为了与选择器一起使用,必须首先通过register方法注册此类的实例。此方法返回一个新的SelectionKey对象,表示通道在选择器中的注册。

一旦向选择器注册,通道将保持注册状态,直到取消注册。这涉及通过选择器分配给通道的任何资源的释放。

通道不能直接取消注册;相反,表示其注册的键必须被取消。取消键会请求在选择器的下一个选择操作期间取消通道的注册。可以通过调用其cancel方法显式取消键。当通道关闭时,无论是通过调用其close方法还是通过中断在通道上阻塞的线程,通道的所有键都会被隐式取消。

如果选择器本身关闭,则通道将被取消注册,并且表示其注册的键将被立即作废。

一个通道最多可以向任何特定选择器注册一次。

可以通过调用isRegistered方法来确定通道是否向一个或多个选择器注册。

可供多个并发线程使用可选择通道。

阻塞模式

可选择通道可以是阻塞模式或非阻塞模式。在阻塞模式下,对通道调用的每个I/O操作都将阻塞,直到完成。在非阻塞模式下,I/O操作永远不会阻塞,并且可能传输的字节数少于请求的字节数,甚至可能根本不传输任何字节。可以通过调用其isBlocking方法确定可选择通道的阻塞模式。

新创建的可选择通道始终处于阻塞模式。非阻塞模式在与基于选择器的多路复用一起使用时最有用。在将通道注册到选择器之前,必须将通道置于非阻塞模式,并且在取消注册之前不能将其返回到阻塞模式。

自版本:
1.4
参见:
  • Constructor Details

    • SelectableChannel

      protected SelectableChannel()
      初始化此类的新实例。
  • Method Details

    • 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
      使用给定选择器注册此通道,返回选择键。

      形式为

      sc.register(sel, ops)
      的此便捷方法的调用行为与调用
      sc.register(sel, ops, null)
      的行为完全相同。
      参数:
      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 - 如果blocktrue且此通道已向一个或多个选择器注册
      IOException - 如果发生I/O错误
    • isBlocking

      public abstract boolean isBlocking()
      告知此通道上的每个I/O操作是否会阻塞直到完成。新创建的通道始终处于阻塞模式。

      如果此通道已关闭,则此方法返回的值未指定。

      返回:
      如果此通道处于阻塞模式,则返回true
    • blockingLock

      public abstract Object blockingLock()
      检索在其上configureBlockingregister方法同步的对象。这在需要在短时间内保持特定阻塞模式的适配器的实现中通常很有用。
      返回:
      阻塞模式锁对象