模块 java.base

类 SelectionKey

java.lang.Object
java.nio.channels.SelectionKey
已知子类:
AbstractSelectionKey

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

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

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

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

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

选择键的就绪集指示其通道已为某个操作类别准备就绪,这是一个提示,但不是保证,线程可以执行此类类别中的操作而不会导致线程阻塞。就绪集最有可能在选择操作完成后立即准确。它很可能因外部事件和在相应通道上调用的 I/O 操作而变得不准确。

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

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

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

自从:
1.4
参见:
  • 字段摘要

    字段
    修饰符和类型
    Field
    描述
    static final int
    套接字接受操作的操作设置位。
    static final int
    套接字连接操作的操作设置位。
    static final int
    读操作的操作设置位。
    static final int
    写操作的操作设置位。
  • 构造方法总结

    构造方法
    修饰符
    构造方法
    描述
    protected
    构造此类的实例。
  • 方法总结

    修饰符和类型
    方法
    描述
    final Object
    将给定对象附加到此键。
    final Object
    检索当前附件。
    abstract void
    请求取消此键的通道与其选择器的注册。
    返回为其创建此键的通道。
    abstract int
    检索此密钥的兴趣集。
    abstract SelectionKey
    interestOps(int ops)
    将此键的兴趣集设置为给定值。
    int
    interestOpsAnd(int ops)
    以原子方式将此键的兴趣集设置为现有兴趣集和给定值的按位交集(“和”)。
    int
    interestOpsOr(int ops)
    以原子方式将此键的兴趣集设置为现有兴趣集和给定值的按位并集(“或”)。
    final boolean
    测试此键的通道是否准备好接受新的套接字连接。
    final boolean
    测试此键的通道是否已完成或未能完成其套接字连接操作。
    final boolean
    测试此键的通道是否已准备好读取。
    abstract boolean
    告知此密钥是否有效。
    final boolean
    测试此密钥的通道是否已准备好写入。
    abstract int
    检索此键的就绪操作集。
    abstract Selector
    返回为其创建此键的选择器。

    在类 java.lang.Object 中声明的方法

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • 字段详细信息

    • OP_READ

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

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

      参见:
    • OP_WRITE

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

      假设选择键的兴趣集在 选择操作 的开头包含 OP_WRITE。如果选择器检测到相应的通道已准备好写入、已远程关闭以供进一步读取或有待处理的错误,那么它会将 OP_WRITE 添加到键的就绪集中。

      参见:
    • OP_CONNECT

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

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

      参见:
    • OP_ACCEPT

      public static final int 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 注意:
      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 当且仅当 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