Module  java.base
软件包  java.nio.channels

Class SelectableChannel

  • All Implemented Interfaces:
    CloseableAutoCloseableChannelInterruptibleChannel
    已知直接子类:
    AbstractSelectableChannel


    public abstract class SelectableChannel
    extends AbstractInterruptibleChannel
    implements Channel
    可通过Selector复用的通道

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

    一旦注册了选择器,通道保持注册,直到它被注销 这包括通过选择器取消分配给频道的任何资源。

    渠道不能直接注销; 而是代表其注册的密钥必须被取消 取消密钥请求在选择器的下一个选择操作期间注销通道。 可以通过调用其cancel方法明确地取消密钥。 无论通过调用其close方法还是通过中断在通道上I / O操作中阻塞的线程,通道关闭时,所有通道的密钥都将被隐式取消。

    如果选择器本身被关闭,那么该通道将被注销,并且表示其注册的密钥将被无效,而不再延迟。

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

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

    可选择的通道可安全使用多个并发线程。

    阻塞模式

    可选通道处于阻塞模式或非阻塞模式。 在阻塞模式下,通道上调用的每个I / O操作将阻塞直到完成。 在非阻塞模式下,I / O操作将永远不会阻塞,并且可能会传输比所请求的字节更少的字节,或者根本没有字节。 可选择的信道的阻塞模式可以通过调用其isBlocking方法来确定。

    新创建的可选通道始终处于阻止模式。 非阻塞模式与基于选择器的复用最为有用。 一个通道在被注册到选择器之前必须被置于非阻塞模式,并且在被注销之前可能不会返回到阻塞模式。

    从以下版本开始:
    1.4
    另请参见:
    SelectionKeySelector
    • 构造方法详细信息

      • SelectableChannel

        protected SelectableChannel​()
        初始化此类的新实例。
    • 方法详细信息

      • provider

        public abstract SelectorProvider provider​()
        返回创建此通道的提供程序。
        结果
        创建此频道的提供商
      • validOps

        public abstract int validOps​()
        返回一个operation set标识该频道支持的操作。 在此整数值中设置的位正好表示对该通道有效的操作。 该方法总是为给定的具体通道类返回相同的值。
        结果
        有效操作集
      • 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
      • 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方法同步的对象。 这在实现需要在短时间内保持特定阻塞模式的适配器通常是有用的。
        结果
        阻塞模式锁定对象