public abstract class SelectionKey
extends Object
java.lang.Object | |
↳ | java.nio.channels.SelectionKey |
Known Direct Subclasses |
代表 SelectableChannel
与 Selector
注册的令牌。
每次向选择器注册频道时都会创建一个选择键。 一个密钥保持有效,直到它通过调用其cancel
方法,通过关闭其通道或关闭其选择器来取消 。 取消密钥不会立即将其从选择器中删除; 它将被添加到选择器的cancelled-key set以在下一次选择操作期间移除。 可以通过调用其isValid
方法来测试密钥的有效性。
兴趣集确定下一次调用某个选择器的选择方法时哪些操作类别将进行准备测试。 利益集合用创建密钥时给定的值初始化; 它可能以后通过interestOps(int)
方法更改。
就绪设置标识了键的选择器已经检测到键的通道已准备就绪的操作类别。 当密钥被创建时,就绪集被初始化为零; 它可能稍后会在选择操作期间由选择器更新,但不能直接更新。
选择键的就绪集指示其通道已准备好进行某种操作类别是一种提示,但不是保证,这种类别中的操作可以由线程执行而不会导致线程阻塞。 就绪设置在选择操作完成后立即很可能是准确的。 外部事件和通过相应通道调用的I / O操作可能会使其不准确。
该类定义了所有已知的操作集位,但是给定通道支持哪些位取决于通道的类型。 SelectableChannel
每个子类SelectableChannel
定义了一个validOps()
方法,该方法返回一个只识别通道支持的操作的集合。 尝试设置或测试密钥通道不支持的操作集位会导致适当的运行时异常。
通常有必要将某些应用程序特定的数据与选择键相关联,例如表示较高级别协议状态的对象,并处理准备就绪通知以实现该协议。 因此选择键支持单个任意对象的一个键的连接 。 一个对象可以通过attach
方法连接,然后通过attachment
方法检索。
选择键对于多个并发线程是安全的。 读取和写入兴趣集的操作通常将与选择器的某些操作同步。 这种同步的具体执行方式取决于实现:在一个天真的实现中,如果选择操作已在进行中,读取或写入兴趣集可能会无限期地阻塞; 在高性能的实现中,读取或写入兴趣集可能会暂时阻止,如果有的话。 在任何情况下,选择操作将始终使用操作开始时当前的兴趣值。
也可以看看:
Constants |
|
---|---|
int |
OP_ACCEPT 用于套接字接受操作的操作设置位。 |
int |
OP_CONNECT 套接字连接操作的操作设置位。 |
int |
OP_READ 读取操作的操作设置位。 |
int |
OP_WRITE 写操作的操作设置位。 |
Protected constructors |
|
---|---|
SelectionKey() 构造这个类的一个实例。 |
Public methods |
|
---|---|
final Object |
attach(Object ob) 将给定的对象附加到该键上。 |
final Object |
attachment() 检索当前附件。 |
abstract void |
cancel() 请求取消该密钥的频道注册。 |
abstract SelectableChannel |
channel() 返回此键创建的频道。 |
abstract int |
interestOps() 检索此密钥的兴趣集。 |
abstract SelectionKey |
interestOps(int ops) 将此键的兴趣集设置为给定值。 |
final boolean |
isAcceptable() 测试此密钥的通道是否准备好接受新的套接字连接。 |
final boolean |
isConnectable() 测试此密钥的通道是否已完成或未完成其套接字连接操作。 |
final boolean |
isReadable() 测试此密钥的频道是否准备好阅读。 |
abstract boolean |
isValid() 告诉这个键是否有效。 |
final boolean |
isWritable() 测试此密钥的通道是否准备好写入。 |
abstract int |
readyOps() 检索此密钥的就绪操作集。 |
abstract Selector |
selector() 返回为其创建此键的选择器。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
int OP_ACCEPT
用于套接字接受操作的操作设置位。
假设选择键的兴趣集在selection operation的开头包含OP_ACCEPT 。 如果选择器检测到相应的服务器套接字通道已准备好接受另一个连接,或者有一个待处理的错误,则它会将OP_ACCEPT添加到密钥的就绪集并将密钥添加到其所选密钥集中。
常量值:16(0x00000010)
int OP_CONNECT
套接字连接操作的操作设置位。
假设选择键的兴趣集在selection operation的开头包含OP_CONNECT 。 如果选择器检测到相应的套接字通道已准备好完成其连接序列,或者有待处理的错误,那么它会将OP_CONNECT添加到该键的就绪集并将该关键字添加到其所选关键字集中。
常量值:8(0x00000008)
int OP_READ
读取操作的操作设置位。
假设选择键的兴趣集在selection operation的开头包含OP_READ 。 如果选择器检测到相应的通道已准备好读取,已到达流尾,已被远程关闭以供进一步读取,或者有待处理的错误,则它将添加OP_READ到该键的就绪操作集并添加它的选定键集的关键。
常数值:1(0x00000001)
int OP_WRITE
写操作的操作设置位。
假设选择键的兴趣集在selection operation的开头包含OP_WRITE 。 如果选择器检测到相应的通道已准备好写入,已被远程关闭以供进一步写入,或者有待处理的错误,则会将OP_WRITE添加到密钥的就绪集并将密钥添加到其所选密钥集中。
常量值:4(0x00000004)
Object attach (Object ob)
将给定的对象附加到该键上。
稍后可以通过attachment
方法检索附加对象。 一次只能附加一个对象; 调用此方法会导致任何以前的附件被丢弃。 附件null可能会丢弃当前附件。
Parameters | |
---|---|
ob |
Object : The object to be attached; may be null |
Returns | |
---|---|
Object |
The previously-attached object, if any, otherwise null |
Object attachment ()
检索当前附件。
Returns | |
---|---|
Object |
The object currently attached to this key, or null if there is no attachment |
void cancel ()
请求取消该密钥的频道注册。 返回时,密钥将无效,并将被添加到其选择器的取消密钥集中。 在下一次选择操作期间,键将从所有选择器的键组中移除。
如果该键已被取消,则调用此方法不起作用。 一旦取消,钥匙永远无效。
这个方法可以在任何时候调用。 它在选择器的已取消密钥集上同步,因此如果与涉及相同选择器的取消或选择操作同时进行调用,则可能暂时阻止。
SelectableChannel channel ()
返回此键创建的频道。 即使密钥被取消,该方法仍将继续返回通道。
Returns | |
---|---|
SelectableChannel |
This key's channel |
int interestOps ()
检索此密钥的兴趣集。
保证返回的集合只包含对该密钥通道有效的操作位。
这个方法可以在任何时候调用。 无论是否阻止以及实施依赖多长时间。
Returns | |
---|---|
int |
This key's interest set |
Throws | |
---|---|
CancelledKeyException |
If this key has been cancelled |
SelectionKey interestOps (int ops)
将此键的兴趣集设置为给定值。
这个方法可以在任何时候调用。 无论是否阻止以及实施依赖多长时间。
Parameters | |
---|---|
ops |
int : The new interest set |
Returns | |
---|---|
SelectionKey |
This selection key |
Throws | |
---|---|
IllegalArgumentException |
If a bit in the set does not correspond to an operation that is supported by this key's channel, that is, if (ops & ~channel().validOps()) != 0 |
CancelledKeyException |
If this key has been cancelled |
boolean isAcceptable ()
测试此密钥的通道是否准备好接受新的套接字连接。
表达式 k.isAcceptable()的这种方法的调用的行为与表达式完全相同
k.readyOps() & OP_ACCEPT != 0
如果此密钥的频道不支持套接字接受操作,则此方法始终返回 false 。
Returns | |
---|---|
boolean |
true if, and only if, readyOps() & OP_ACCEPT is nonzero |
Throws | |
---|---|
CancelledKeyException |
If this key has been cancelled |
boolean isConnectable ()
测试此密钥的通道是否已完成或未完成其套接字连接操作。
表单 k.isConnectable()的此方法的调用与 表达式的行为方式完全相同
k.readyOps() & OP_CONNECT != 0
如果此密钥的频道不支持套接字连接操作,则此方法始终返回 false 。
Returns | |
---|---|
boolean |
true if, and only if, readyOps() & OP_CONNECT is nonzero |
Throws | |
---|---|
CancelledKeyException |
If this key has been cancelled |
boolean isReadable ()
测试此密钥的频道是否准备好阅读。
表单 k.isReadable()的此方法的调用与 表达式的行为完全相同
k.readyOps() & OP_READ != 0
如果此键的通道不支持读取操作,则此方法始终返回 false 。
Returns | |
---|---|
boolean |
true if, and only if, readyOps() & OP_READ is nonzero |
Throws | |
---|---|
CancelledKeyException |
If this key has been cancelled |
boolean isValid ()
告诉这个键是否有效。
密钥在创建时是有效的,并且一直保持到它被取消,其频道关闭或者其选择器关闭。
Returns | |
---|---|
boolean |
true if, and only if, this key is valid |
boolean isWritable ()
测试此密钥的通道是否准备好写入。
表单 k.isWritable()的此方法的调用与表达式的使用方式完全相同
k.readyOps() & OP_WRITE != 0
如果此键的通道不支持写入操作,则此方法始终返回 false 。
Returns | |
---|---|
boolean |
true if, and only if, readyOps() & OP_WRITE is nonzero |
Throws | |
---|---|
CancelledKeyException |
If this key has been cancelled |
int readyOps ()
检索此密钥的就绪操作集。
保证返回的集合只包含对该密钥通道有效的操作位。
Returns | |
---|---|
int |
This key's ready-operation set |
Throws | |
---|---|
CancelledKeyException |
If this key has been cancelled |
Selector selector ()
返回为其创建此键的选择器。 即使密钥被取消,该方法仍会继续返回选择器。
Returns | |
---|---|
Selector |
This key's selector |