Module java.base

Class SelectionKey

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

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

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

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

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

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

选择键的就绪集指示其通道准备好执行某些操作类别,这只是一个提示,而不是保证,线程可以在不导致线程阻塞的情况下执行该类别中的操作。就绪集在选择操作完成后立即最有可能是准确的。外部事件和在相应通道上调用的I/O操作可能会使其不准确。

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

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

选择键可供多个并发线程安全使用。选择操作将始终使用在操作开始时的兴趣集值。

自:
1.4
参见:
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final int
    套接字接受操作的操作集位。
    static final int
    套接字连接操作的操作集位。
    static final int
    读操作的操作集位。
    static final int
    写操作的操作集位。
  • Constructor Summary

    Constructors
    Modifier
    Constructor
    Description
    protected
    构造此类的实例。
  • Method Summary

    Modifier and Type
    Method
    Description
    final Object
    attach(Object ob)
    将给定对象附加到此键。
    final Object
    检索当前附件。
    abstract void
    cancel()
    请求取消此键的通道与其选择器的注册。
    返回创建此键的通道。
    abstract int
    检索此键的兴趣集。
    abstract SelectionKey
    interestOps(int ops)
    将此键的兴趣集设置为给定值。
    int
    interestOpsAnd(int ops)
    将此键的兴趣集原子设置为现有兴趣集和给定值的按位交集("and")。
    int
    interestOpsOr(int ops)
    将此键的兴趣集原子设置为现有兴趣集和给定值的按位并集("or")。
    final boolean
    测试此键的通道是否准备好接受新的套接字连接。
    final boolean
    测试此键的通道是否已完成或未能完成其套接字连接操作。
    final boolean
    测试此键的通道是否准备好读取。
    abstract boolean
    告知此键是否有效。
    final boolean
    测试此键的通道是否准备好写入。
    abstract int
    检索此键的就绪操作集。
    abstract Selector
    返回创建此键的选择器。

    Methods declared in class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • 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

      参见:
  • Constructor Details

    • SelectionKey

      protected SelectionKey()
      构造此类的实例。
  • Method Details

    • 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)
      原子地将此键的兴趣集设置为现有兴趣集和给定值的按位并集(“or”)。此方法保证在其他并发调用此方法或interestOpsAnd(int)时是原子的。

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

      实现要求:
      默认实现在此键上同步,并调用interestOps()interestOps(int)来检索和设置此键的兴趣集。
      参数:
      ops - 要应用的兴趣集
      返回:
      先前的兴趣集
      抛出:
      IllegalArgumentException - 如果集合中的位不对应于此键的通道支持的操作,即,如果(ops & ~channel().validOps()) != 0
      CancelledKeyException - 如果此键已被取消
      自:
      11
    • interestOpsAnd

      public int interestOpsAnd(int ops)
      原子地将此键的兴趣集设置为现有兴趣集和给定值的按位交集(“and”)。此方法保证在其他并发调用此方法或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