- 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
-
-
Field Summary
Fields Modifier and Type Field 描述 static int
OP_ACCEPT
操作集位用于插座接受操作。static int
OP_CONNECT
用于套接字连接操作的操作集位。static int
OP_READ
读操作的操作位。static int
OP_WRITE
写操作的操作位。
-
构造方法摘要
构造方法 Modifier Constructor 描述 protected
SelectionKey()
构造这个类的一个实例。
-
方法摘要
所有方法 接口方法 抽象方法 具体的方法 Modifier and Type 方法 描述 Object
attach(Object ob)
将给定对象附加到此键。Object
attachment()
检索当前附件。abstract void
cancel()
要求取消该密钥的通道与其选择器的注册。abstract SelectableChannel
channel()
返回创建此键的通道。abstract int
interestOps()
检索此密钥的兴趣集。abstract SelectionKey
interestOps(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
到密钥的就绪操作集并添加它的选择键集的关键。- 另请参见:
- 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
-
-
方法详细信息
-
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
-
-