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

Class SelectionKey

  • 已知直接子类:
    AbstractSelectionKey


    public abstract class SelectionKey
    extends Object
    代表SelectableChannelSelector的注册的令牌。

    每当通道被选择器注册时,都会创建一个选择键。 直到它被调用其取消一个关键保持有效cancel方法,通过关闭它的信道,或通过关闭它的选择器。 取消键不会立即将其从选择器中删除; 而是在下一个选择操作期间将其添加到选择器的cancelled-key set以进行删除。 密钥的有效性可以通过调用其isValid方法来测试。

    选择键包含以整数值表示的两个操作集 操作集的每一位表示由密钥通道支持的可选择操作的类别。

    • 兴趣集确定下一次调用选择器的选择方法之一后,准备测试哪些操作类别。 兴趣集在创建密钥时用给定的值初始化; 它可以稍后通过interestOps(int)方法进行更改。

    • 准备集标识了键的选择器已经检测到密钥通道已准备就绪的操作类别。 当创建密钥时,就绪集被初始化为零; 可能在选择操作期间可能会被选择器更新,但不能直接更新。

    选择键的就绪集表示其通道对某些操作类别做好准备是一个提示,但不能保证这样的类别中的操作可以由线程执行而不会导致线程阻塞。 在完成选择操作之后,准备好的集合很可能是准确的。 外部事件和相应通道上调用的I / O操作可能不准确。

    该类定义了所有已知的操作设置位,但是确切地说,给定通道支持哪些位取决于通道的类型。 SelectableChannel每个子类定义了一个validOps()方法,它返回一组仅识别通道支持的操作的集合。 尝试设置或测试密钥通道不支持的操作集位将导致适当的运行时异常。

    通常需要将某些特定于应用程序的数据与选择密钥相关联,例如表示较高级别协议的状态的对象,并处理就绪通知以实现该协议。 因此,选择键支持将单个任意对象附加到键。 可以通过attach方法附加一个对象,然后通过attachment方法检索。

    多个并发线程使用选择键是安全的。 通常,读取和写入兴趣集的操作将与选择器的某些操作同步。 正是这种同步的执行方式取决于实现:在天真的实现中,如果选择操作已经进行,则读取或写入兴趣集可能会无限期地阻止; 在高性能的实施中,阅读或写入兴趣集可能会暂时阻止,如果有的话。 在任何情况下,选择操作将始终使用在操作开始时当前的兴趣值。

    从以下版本开始:
    1.4
    另请参见:
    SelectableChannelSelector
    • 字段详细信息

      • OP_READ

        public static final int OP_READ
        读操作的操作位。

        假设选择键的兴趣集在OP_READ开始时包含OP_READ 如果选择器检测到相应的通道已准备好进行读取,已经达到流出端,已被远程关闭以进一步读取,或者出现错误等待,那么它将添加OP_READ到密钥的就绪操作集并添加它的选择键集的关键。

        另请参见:
        Constant Field Values
      • OP_WRITE

        public static final int OP_WRITE
        写操作的操作位。

        假设选择键的兴趣集在OP_WRITE开始时包含OP_WRITE 如果选择器检测到相应的通道已准备好进行写入,则已被远程关闭进一步写入,或者出现错误等待,那么将会将OP_WRITE添加到密钥的准备集中,并将密钥添加到其选定的密钥集中。

        另请参见:
        Constant Field Values
      • OP_CONNECT

        public static final int OP_CONNECT
        用于套接字连接操作的操作集位。

        假设选择键的兴趣集在OP_CONNECT开始时包含OP_CONNECT 如果选择器检测到相应的套接字通道准备好完成其连接顺序,或者出现错误等待,那么它将添加OP_CONNECT到密钥的准备集合,并将密钥添加到其选定密钥集。

        另请参见:
        Constant Field Values
      • OP_ACCEPT

        public static final int OP_ACCEPT
        操作集位用于插座接受操作。

        假设选择键的兴趣集在OP_ACCEPT的开头包含OP_ACCEPT 如果选择器检测到相应的服务器套接字通道准备好接受另一个连接,或者出现错误等待,那么它将添加OP_ACCEPT到密钥的准备集合,并将密钥添加到其选定的密钥集。

        另请参见:
        Constant Field Values
    • 构造方法详细信息

      • SelectionKey

        protected SelectionKey​()
        构造这个类的一个实例。
    • 方法详细信息

      • channel

        public abstract SelectableChannel channel​()
        返回创建此键的通道。 该方法即使在取消键之后仍将继续返回通道。
        结果
        这个键的通道
      • selector

        public abstract Selector selector​()
        返回创建此键的选择器。 该方法即使在取消键之后也会继续返回选择器。
        结果
        此键的选择器
      • isValid

        public abstract boolean isValid​()
        告知这个密钥是否有效。

        钥匙在创建时有效,并保持原样,直到它被取消,其通道关闭或其选择器关闭。

        结果
        true如果,且仅当此密钥有效
      • cancel

        public abstract void cancel​()
        要求取消该密钥的通道与其选择器的注册。 返回后,密钥将无效,并将被添加到其选择器的已取消密钥集中。 在下一次选择操作期间,钥匙将从所有选择器的钥匙组中移除。

        如果此键已被取消,则调用此方法不起作用。 一旦取消,钥匙永远无效。

        可以随时调用此方法。 它在选择器的取消键集合上同步,因此如果同时使用涉及相同选择器的取消或选择操作同时调用。

      • interestOps

        public abstract int interestOps​()
        检索此密钥的兴趣集。

        保证返回的集合只包含对该密钥的通道有效的操作位。

        可以随时调用此方法。 它是否阻止,以及实施依赖于多长时间。

        结果
        这个钥匙的兴趣集
        异常
        CancelledKeyException - 如果该键已被取消
      • interestOps

        public abstract SelectionKey interestOps​(int ops)
        将此键的兴趣设置为给定值。

        可以随时调用此方法。 它是否阻止,以及实施依赖于多长时间。

        参数
        ops - 新的兴趣集
        结果
        该选择键
        异常
        IllegalArgumentException - 如果集合中的某个位不对应于此密钥通道支持的操作,即 (ops & ~channel().validOps()) != 0
        CancelledKeyException - 如果此键已取消
      • readyOps

        public abstract int readyOps​()
        检索此密钥的即用操作集。

        保证返回的集合只包含对该密钥的通道有效的操作位。

        结果
        这个钥匙的就绪操作集
        异常
        CancelledKeyException - 如果此键已取消
      • isReadable

        public final boolean isReadable​()
        测试此密钥的频道是否可以阅读。

        对这种k.isReadable()形式的方法的调用与表达式完全相同

        
         k.readyOps() & OP_READ != 0
         

        如果此键的通道不支持读取操作,则此方法始终返回false

        结果
        true如果,并且只有 readyOps() & OP_READ是非零
        异常
        CancelledKeyException - 如果此键已取消
      • isWritable

        public final boolean isWritable​()
        测试此密钥的通道是否准备好进行写入。

        表达式k.isWritable()的此方法的调用与表达式完全相同

        
         k.readyOps() & OP_WRITE != 0
         

        如果此键的通道不支持写操作,则此方法始终返回false

        结果
        true如果,且仅当 readyOps() & OP_WRITE为非零
        异常
        CancelledKeyException - 如果该键已被取消
      • isConnectable

        public final boolean isConnectable​()
        测试此密钥的通道是否已完成或未完成其套接字连接操作。

        这种k.isConnectable()形式的方法的调用与表达式完全相同

        
         k.readyOps() & OP_CONNECT != 0
         

        如果此键的通道不支持套接字连接操作,则此方法始终返回false

        结果
        true如果,且仅当 readyOps() & OP_CONNECT为非零
        异常
        CancelledKeyException - 如果此键已取消
      • isAcceptable

        public final boolean isAcceptable​()
        测试此密钥的通道是否已准备好接受新的套接字连接。

        这种k.isAcceptable()形式的方法的调用与表达式完全相同

        
         k.readyOps() & OP_ACCEPT != 0
         

        如果此键的通道不支持套接字接受操作,则此方法始终返回false

        结果
        true如果,且仅当 readyOps() & OP_ACCEPT为非零
        异常
        CancelledKeyException - 如果此键已取消
      • attach

        public final Object attach​(Object ob)
        将给定对象附加到此键。

        随后可以通过attachment方法检索附件 一次只能附加一件物品; 调用此方法将导致任何先前的附件被丢弃。 目前的附件可以通过附加null来丢弃。

        参数
        ob - 要附加的对象; 可能是null
        结果
        先前附加的对象,如果有的话,否则为 null
      • attachment

        public final Object attachment​()
        检索当前附件。
        结果
        当前附加到该键的对象,如果没有附件, null