模块  java.base
软件包  java.nio.channels

Class SelectableChannel

  • 实现的所有接口
    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方法同步的对象。 这通常适用于需要在短时间内维持特定阻塞模式的适配器。
        结果
        阻塞模式锁定对象