Module java.base

Class AbstractSelectableChannel

所有已实现的接口:
Closeable, AutoCloseable, Channel, InterruptibleChannel
直接已知的子类:
DatagramChannel, Pipe.SinkChannel, Pipe.SourceChannel, SctpChannel, SctpMultiChannel, SctpServerChannel, ServerSocketChannel, SocketChannel

public abstract class AbstractSelectableChannel extends SelectableChannel
可选择通道的基本实现类。

该类定义了处理通道注册、注销和关闭机制的方法。它维护了该通道的当前阻塞模式以及当前的选择键集合。它执行了实现SelectableChannel规范所需的所有同步。该类中定义的受保护的抽象方法的实现不需要与可能正在执行相同操作的其他线程同步。

自 JDK 版本:
1.4
  • Constructor Details

    • AbstractSelectableChannel

      protected AbstractSelectableChannel(SelectorProvider provider)
      初始化此类的新实例。
      参数:
      provider - 创建此通道的提供程序
  • Method Details

    • provider

      public final SelectorProvider provider()
      返回创建此通道的提供程序。
      指定者:
      provider 在类 SelectableChannel
      返回:
      创建此通道的提供程序
    • isRegistered

      public final boolean isRegistered()
      从类中复制的描述: SelectableChannel
      告知此通道当前是否已向任何选择器注册。新创建的通道未注册。

      由于密钥取消和通道注销之间固有的延迟,通道可能在其所有密钥被取消后的一段时间内保持注册状态。通道也可能在关闭后的一段时间内保持注册状态。

      指定者:
      isRegistered 在类 SelectableChannel
      返回:
      true 如果且仅如果此通道已注册
    • keyFor

      public final SelectionKey keyFor(Selector sel)
      从类中复制的描述: SelectableChannel
      检索表示通道与给定选择器注册的键。
      指定者:
      keyFor 在类 SelectableChannel
      参数:
      sel - 选择器
      返回:
      当此通道最后与给定选择器注册时返回的密钥,如果此通道当前未向该选择器注册,则返回null
    • register

      public final SelectionKey register(Selector sel, int ops, Object att) throws ClosedChannelException
      使用给定选择器注册此通道,返回选择键。

      此方法首先验证此通道是否打开,并且给定的初始兴趣集是否有效。

      如果此通道已经向给定选择器注册,则返回表示该注册的选择键,并在设置其兴趣集为给定值后返回。

      否则,此通道尚未向给定选择器注册,因此在持有适当的锁时调用选择器的register方法。生成的密钥将添加到此通道的密钥集中,然后返回。

      指定者:
      register 在类 SelectableChannel
      参数:
      sel - 要注册此通道的选择器
      ops - 结果密钥的兴趣集
      att - 结果密钥的附件;可以为null
      返回:
      表示此通道向给定选择器注册的密钥
      抛出:
      ClosedSelectorException - 如果选择器已关闭
      IllegalBlockingModeException - 如果此通道处于阻塞模式
      IllegalSelectorException - 如果此通道不是由与给定选择器相同的提供程序创建的
      CancelledKeyException - 如果此通道当前已向给定选择器注册,但相应的密钥已被取消
      IllegalArgumentException - 如果ops集中的位不对应于此通道支持的操作,即如果set & ~validOps() != 0
      ClosedChannelException - 如果此通道已关闭
    • implCloseChannel

      protected final void implCloseChannel() throws IOException
      关闭此通道。

      此方法在close方法中指定,在implCloseSelectableChannel方法中执行实际的关闭工作。然后取消所有此通道的密钥。

      指定者:
      implCloseChannel 在类 AbstractInterruptibleChannel
      抛出:
      IOException - 如果关闭通道时发生 I/O 错误
    • implCloseSelectableChannel

      protected abstract void implCloseSelectableChannel() throws IOException
      关闭此可选择通道。

      此方法由close方法调用,以执行关闭通道的实际工作。仅当通道尚未关闭时才会调用此方法,而且永远不会多次调用。

      此方法的实现必须安排任何在此通道上阻塞在 I/O 操作中的其他线程立即返回,可以通过抛出异常或正常返回来实现。

      抛出:
      IOException - 如果发生 I/O 错误
    • isBlocking

      public final boolean isBlocking()
      从类中复制的描述: SelectableChannel
      告知此通道上的每个 I/O 操作是否会阻塞直到完成。新创建的通道始终处于阻塞模式。

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

      指定者:
      isBlocking 在类 SelectableChannel
      返回:
      true 如果且仅如果此通道处于阻塞模式
    • blockingLock

      public final Object blockingLock()
      从类中复制的描述: SelectableChannel
      检索configureBlockingregister方法同步的对象。这在需要在短时间内保持特定阻塞模式的适配器的实现中通常很有用。
      指定者:
      blockingLock 在类 SelectableChannel
      返回:
      阻塞模式锁对象
    • configureBlocking

      public final SelectableChannel configureBlocking(boolean block) throws IOException
      调整此通道的阻塞模式。

      如果给定的阻塞模式与当前阻塞模式不同,则此方法将调用implConfigureBlocking方法,同时保持适当的锁,以更改模式。

      指定者:
      configureBlocking 在类 SelectableChannel
      参数:
      block - 如果为true,则此通道将被置于阻塞模式;如果为false,则将置于非阻塞模式
      返回:
      此可选择通道
      抛出:
      ClosedChannelException - 如果此通道已关闭
      IOException - 如果发生I/O错误
    • implConfigureBlocking

      protected abstract void implConfigureBlocking(boolean block) throws IOException
      调整此通道的阻塞模式。

      此方法由configureBlocking方法调用,以执行更改阻塞模式的实际工作。仅当新模式与当前模式不同时才会调用此方法。

      参数:
      block - 如果为true,则此通道将被置于阻塞模式;如果为false,则将置于非阻塞模式
      抛出:
      IOException - 如果发生I/O错误