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

Class SelectionKey

  • 已知直接子类:
    AbstractSelectionKey

    public abstract class SelectionKey
    extends Object
    代表SelectableChannel注册Selector令牌

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

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

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

    • 就绪集合通过键的选择器识别检测到键的通道准备就绪的操作类别。 创建密钥时,就绪集初始化为零; 它可能稍后在选择操作期间由选择器更新,但不能直接更新。

    选择键的就绪集指示其通道已准备好用于某些操作类别是暗示但不保证这样的类别中的操作可由线程执行而不会导致线程阻塞。 在完成选择操作之后,就绪设置最有可能是准确的。 外部事件和在相应通道上调用的I / O操作可能会使其不准确。

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

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

    选择键可以安全地由多个并发线程使用。 选择操作将始终使用操作开始时当前的兴趣设置值。

    从以下版本开始:
    1.4
    另请参见:
    SelectableChannelSelector
    • 字段汇总

      字段  
      变量和类型 字段 描述
      static int OP_ACCEPT
      用于套接字操作的操作设置位。
      static int OP_CONNECT
      用于套接字连接操作的操作设置位。
      static int OP_READ
      读操作的操作设置位。
      static int OP_WRITE
      写操作的操作设置位。
    • 构造方法摘要

      构造方法  
      变量 构造器 描述
      protected SelectionKey()
      构造此类的实例。
    • 字段详细信息

      • OP_READ

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

        假设选择键的兴趣集在OP_READ的开头包含OP_READ 如果选择器检测到相应的通道已准备好进行读取,已达到流结束,已远程关闭以进一步读取,或者有未决错误,则它会将OP_READ添加到该键的就绪操作集中。

        另请参见:
        常数字段值
      • OP_WRITE

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

        假设选择键的兴趣集在OP_WRITE的开头包含OP_WRITE 如果选择器检测到相应的通道已准备好写入,已远程关闭以进一步写入,或者有未决的错误,则它将OP_WRITE添加到该键的就绪集。

        另请参见:
        常数字段值
      • OP_CONNECT

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

        假设选择键的兴趣集在OP_CONNECT的开头包含OP_CONNECT 如果选择器检测到相应的套接字通道已准备好完成其连接顺序,或者有一个错误未决,则它会将OP_CONNECT添加到密钥的就绪集。

        另请参见:
        常数字段值
      • OP_ACCEPT

        public static final int OP_ACCEPT
        用于套接字操作的操作设置位。

        假设选择键的兴趣集在OP_ACCEPT的开头包含OP_ACCEPT 如果选择器检测到相应的服务器套接字通道已准备好接受另一个连接,或者有一个错误未决,则它会将OP_ACCEPT添加到该密钥的就绪集。

        另请参见:
        常数字段值
    • 构造方法详细信息

      • 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 - 如果此键已被取消
      • interestOpsOr

        public int interestOpsOr​(int ops)
        以原子方式将此键的兴趣集设置为现有兴趣集和给定值的按位联合(“或”)。 对于此方法或interestOpsAnd(int)其他并发调用,此方法保证是原子的。

        可以随时调用此方法。 如果在选择操作正在进行时调用此方法,则它对该操作没有影响; 下一个选择操作将看到对密钥兴趣集的更改。

        实现要求:
        默认实现在此密钥上同步,并调用 interestOps()interestOps(int)来检索和设置此密钥的兴趣集。
        参数
        ops - 要应用的兴趣
        结果
        之前的兴趣集
        异常
        IllegalArgumentException - 如果集合中的某个位与此密钥通道支持的操作不对应,即 (ops & ~channel().validOps()) != 0
        CancelledKeyException - 如果此键已被取消
        从以下版本开始:
        11
      • interestOpsAnd

        public int interestOpsAnd​(int ops)
        以原子方式将此键的兴趣集设置为现有兴趣集和给定值的按位交集(“和”)。 对于此方法或interestOpsOr(int)其他并发调用,此方法保证是原子的。

        可以随时调用此方法。 如果在选择操作正在进行时调用此方法,则它对该操作没有影响; 下一个选择操作将看到对密钥兴趣集的更改。

        API Note:
        interestOps(int)interestOpsOr(int)方法不同,当使用兴趣集中的位调用时,此方法不会抛出IllegalArgumentException ,该位与该键的通道所支持的操作不对应。 这是为了允许使用按位补码值清除感兴趣组中的操作位,例如, interestOpsAnd(~SelectionKey.OP_READ)将从感兴趣集中移除OP_READ而不影响其他位。
        实现要求:
        默认实现在此密钥上同步,并调用 interestOps()interestOps(int)来检索和设置此密钥的兴趣集。
        参数
        ops - 申请的利息
        结果
        之前的兴趣集
        异常
        CancelledKeyException - 如果此键已被取消
        从以下版本开始:
        11
      • 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 if且仅当 readyOps() & OP_CONNECT非零时
        异常
        CancelledKeyException - 如果此键已被取消
      • isAcceptable

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

        k.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