- java.lang.Object
-
- java.nio.channels.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
- 另请参见:
-
SelectableChannel
,Selector
-
-
字段汇总
字段 变量和类型 字段 描述 static int
OP_ACCEPT
用于套接字操作的操作设置位。static int
OP_CONNECT
用于套接字连接操作的操作设置位。static int
OP_READ
读操作的操作设置位。static int
OP_WRITE
写操作的操作设置位。
-
构造方法摘要
构造方法 变量 构造器 描述 protected
SelectionKey()
构造此类的实例。
-
方法摘要
所有方法 实例方法 抽象方法 具体的方法 变量和类型 方法 描述 Object
attach(Object ob)
将给定对象附加到此键。Object
attachment()
检索当前附件。abstract void
cancel()
请求取消此密钥通道及其选择器的注册。abstract SelectableChannel
channel()
返回为其创建密钥的通道。abstract int
interestOps()
检索此键的兴趣集。abstract SelectionKey
interestOps(int ops)
将此键的兴趣集设置为给定值。int
interestOpsAnd(int ops)
以原子方式将此键的兴趣集设置为现有兴趣集和给定值的按位交集(“和”)。int
interestOpsOr(int ops)
以原子方式将此键的兴趣集设置为现有兴趣集和给定值的按位联合(“或”)。boolean
isAcceptable()
测试此密钥的通道是否已准备好接受新的套接字连接。boolean
isConnectable()
测试此密钥的通道是否已完成或未能完成其套接字连接操作。boolean
isReadable()
测试此键的频道是否已准备好进行阅读。abstract boolean
isValid()
判断此密钥是否有效。boolean
isWritable()
测试此密钥的通道是否已准备好写入。abstract int
readyOps()
检索此键的就绪操作集。abstract Selector
selector()
返回为其创建此键的选择器。
-
-
-
字段详细信息
-
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
添加到密钥的就绪集。- 另请参见:
- 常数字段值
-
-
方法详细信息
-
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
-
-