public abstract class SelectionKey extends Object
SelectableChannel
与Selector
的注册 。
每当通道被选择器注册时,都会创建一个选择键。 直到它被调用其取消一个关键保持有效cancel
方法,通过关闭它的信道,或通过关闭它的选择器。 取消键不会立即将其从选择器中删除; 而是在下一个选择操作期间添加到选择器的cancelled-key set中以进行删除。 密钥的有效性可以通过调用其isValid
方法来测试。
选择键包含两个表示为整数值的操作集 。 操作集的每一位表示由密钥通道支持的可选择操作的类别。
兴趣集确定下一次调用选择器的选择方法之一后,准备测试哪些操作类别。 兴趣集在创建密钥时用给定的值初始化; 可以稍后通过interestOps(int)
方法进行更改。
准备集标识了键的选择器已经检测到密钥通道已准备就绪的操作类别。 当创建密钥时,就绪集被初始化为零; 可能在选择操作期间可能会被选择器更新,但不能直接更新。
选择键的就绪集表示其通道对某些操作类别做好准备是一个提示,但不能保证这样的类别中的操作可以由线程执行而不会导致线程阻塞。 在完成选择操作之后,准备好的集合很可能是准确的。 外部事件和相应通道上调用的I / O操作可能会导致不准确。
该类定义了所有已知的操作设置位,但是确切地说,给定通道支持哪些位取决于通道的类型。 SelectableChannel
的每个子类定义了一个validOps()
方法,它返回一组仅识别通道支持的操作的集合。 尝试设置或测试密钥通道不支持的操作集位将导致适当的运行时异常。
通常需要将某些特定于应用程序的数据与选择密钥相关联,例如表示较高级别协议的状态的对象,并处理就绪通知以实现该协议。 因此选择键支持单个任意对象的一个键的连接 。 可以通过attach
方法附加一个对象,然后通过attachment
方法检索 。
多个并发线程使用选择键是安全的。 通常,读取和写入兴趣集的操作将与选择器的某些操作同步。 正是这种同步的执行方式取决于实现:在天真的实现中,如果选择操作已经进行,则读取或写入兴趣集可能会无限期地阻止; 在高性能的实施中,阅读或写入兴趣集可能会暂时阻止,如果有的话。 在任何情况下,选择操作将始终使用在操作开始时当前的兴趣值。
SelectableChannel
, Selector
Modifier and Type | Field and Description |
---|---|
static int |
OP_ACCEPT
操作集位用于插座接受操作。
|
static int |
OP_CONNECT
用于套接字连接操作的操作集位。
|
static int |
OP_READ
读操作的操作位。
|
static int |
OP_WRITE
写操作的操作位。
|
Modifier | Constructor and Description |
---|---|
protected |
SelectionKey()
构造这个类的一个实例。
|
Modifier and Type | Method and Description |
---|---|
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()
返回创建此键的选择器。
|
public static final int OP_READ
假设选择键的兴趣集在selection operation开始时包含OP_READ 。 如果选择器检测到相应的通道已准备好进行读取,则已经达到流出端,已被远程关闭以进一步读取,或者出现错误等待,那么将会将OP_READ添加到密钥的即用操作集中,并添加它的选择键集的关键。
public static final int OP_WRITE
假设选择键的兴趣集在selection operation开始时包含OP_WRITE 。 如果选择器检测到相应的通道已准备好进行写入,则已被远程关闭以进行进一步的写入,或者出现错误等待,则会将OP_WRITE添加到密钥的准备集中,并将密钥添加到其选定的密钥集中。
public static final int OP_CONNECT
假设选择键的兴趣集在selection operation开始时包含OP_CONNECT 。 如果选择器检测到相应的套接字通道已准备好完成其连接顺序,或者出现错误等待,则会将OP_CONNECT添加到密钥的准备集中,并将密钥添加到其选定的密钥集。
public static final int OP_ACCEPT
假设选择键的兴趣集在selection operation开始时包含OP_ACCEPT 。 如果选择器检测到相应的服务器套接字通道准备好接受另一个连接,或者有一个错误挂起,那么它将添加OP_ACCEPT到密钥的准备集合,并将密钥添加到其选定的密钥集。
public abstract SelectableChannel channel()
public abstract Selector selector()
public abstract boolean isValid()
钥匙在创建时有效,并保持原样,直到它被取消,其通道关闭或其选择器关闭。
public abstract void cancel()
如果此键已被取消,则调用此方法不起作用。 一旦取消,钥匙永远无效。
可以随时调用此方法。 它在选择器的取消键集合上同步,因此如果同时使用涉及相同选择器的取消或选择操作同时调用。
public abstract int interestOps()
保证返回的集合只包含对该密钥的通道有效的操作位。
可以随时调用此方法。 它是否阻止,以及实施依赖于多长时间。
CancelledKeyException
- 如果此键已取消
public abstract SelectionKey interestOps(int ops)
可以随时调用此方法。 它是否阻止,以及实施依赖于多长时间。
ops
- 新的兴趣集
IllegalArgumentException
- 如果集合中的某个位不对应于此密钥通道支持的操作,也就是说,如果
(ops & ~channel().validOps()) != 0
CancelledKeyException
- 如果此键已取消
public abstract int readyOps()
保证返回的集合只包含对该密钥的通道有效的操作位。
CancelledKeyException
- 如果该键已取消
public final boolean isReadable()
这种形式为k.isReadable()的方法的调用与表达式完全相同
k.readyOps() & OP_READ != 0
如果此键的通道不支持读取操作,则此方法始终返回false 。
readyOps() & OP_READ
是非零
CancelledKeyException
- 如果此键已取消
public final boolean isWritable()
对这种形式k.isWritable()的这种方法的调用与表达式完全相同
k.readyOps() & OP_WRITE != 0
如果此键的通道不支持写操作,则此方法始终返回false 。
readyOps() & OP_WRITE
是非零
CancelledKeyException
- 如果此键已取消
public final boolean isConnectable()
调用此方法的形式为k.isConnectable()的行为方式与表达式完全相同
k.readyOps() & OP_CONNECT != 0
如果此键的通道不支持套接字连接操作,则此方法始终返回false 。
readyOps() & OP_CONNECT
为非零
CancelledKeyException
- 如果此键已取消
public final boolean isAcceptable()
这种形式为k.isAcceptable()的方法的调用与表达式完全相同
k.readyOps() & OP_ACCEPT != 0
如果此键的通道不支持套接字接受操作,则此方法始终返回false 。
readyOps() & OP_ACCEPT
是非零
CancelledKeyException
- 如果此键已取消
public final Object attach(Object ob)
随后可以通过attachment
方法检索附件 。 一次只能附加一件物品; 调用此方法会导致任何先前的附件被丢弃。 当前的附件可以通过附加null来丢弃 。
ob
- 要附加的对象;
可能是null
public final Object attachment()