package java.nio.channels;
public abstract class SelectionKey
{
public static final int OP_READ
public static final int OP_WRITE
public static final int OP_CONNECT
public static final int OP_ACCEPT
public abstract SelectableChannel channel( );
public abstract Selector selector( );
public abstract void cancel( );
public abstract boolean isValid( );
public abstract int interestOps( );
public abstract void interestOps (int ops);
public abstract int readyOps( );
public final boolean isReadable( )
public final boolean isWritable( )
public final boolean isConnectable( )
public final boolean isAcceptable( )
public final Object attach (Object ob)
public final Object attachment( )
}
channel( )方法返回与该键相关的SelectableChannel对象。
selector( )则返回相关的Selector对象。
键对象表示了一种特定的注册关系。当应该终结这种关系的时候,可以调用SelectionKey对象的cancel()方法。
isValid( )方法来检查它是否仍然表示一种有效的关系,当键被取消时,它将被放在相关的选择器的已取消的键的集合里。注销不会立即被取消,但键会立即失效。当再次调用select( )方法时,已取消的键的集合中的被取消的键将被清理掉,并且相应的注销也将完成。
当通道关闭时,所有相关的键会自动取消。当选择器关闭时,所有被注册到该选择器的通道都将被注销,并且相关的键将立即被无效化。
一个SelectionKey对象包含两个以整数形式进行编码的比特掩码:一个用于指示那些通道/选择器组合体所关心的操作(instrest集合),另一个表示通道准备好要执行的操作(ready集合)。当前的interest集合可以通过调用键对象的interestOps( )方法来获取,这个interset集合永远不会被选择器改变,但您可以通过调用interestOps( )方法并传入一个新的比特掩码参数来改变它。当相关的Selector上的select( )操作正在进行时改变键的interest集合,不会影响那个正在进行的选择操作。所有更改将会在select( )的下一个调用中体现出来。
键的readyOps( )方法来获取相关的通道的已经就绪的操作。ready集合是interest集合的子集,并且表示了interest集合中从上次调用select( )以来已经就绪的那些操作。
SelectionKey类定义了四个便于使用的布尔方法来测试这些比特值:isReadable( ),isWritable( ),isConnectable( ), 和isAcceptable( )。
if (key.isWritable( ))
等价于:
if ((key.readyOps( ) & SelectionKey.OP_WRITE) != 0)
通过相关的选择键的readyOps( )方法返回的就绪状态指示只是一个提示,不是保证。底层的通道在任何时候都会不断改变。其他线程可能在通道上执行操作并影响它的就绪状态。同时,操作系统的特点也总是需要考虑的。
SelectionKey key = channel.register (selector, SelectionKey.OP_READ, myObject);
等价于:
SelectionKey key = channel.register (selector, SelectionKey.OP_READ);
key.attach (myObject);
SelectionKey对象是线程安全的,但知道修改interest集合的操作是通过Selector对象进行同步的是很重要的。这可能会导致interestOps( )方法的调用会阻塞不确定长的一段时间。