使用选择键(SelectionKey)

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( )方法的调用会阻塞不确定长的一段时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值