NIO/SelectionKey源码解析_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > NIO/SelectionKey源码解析

NIO/SelectionKey源码解析

 2018/3/15 21:47:17  chen.zhu  程序员俱乐部  我要评论(0)
  • 摘要:SelectionKey源码解析转载自:http://blog.csdn.net/robinjwong/article/details/41792623注:句柄:可以认为是对象身份的唯一id,标识应用程序中的不同对象和同类中的不同的实例。句柄不是指针,程序不能利用句柄来直接阅读文件中的信息。解析jdk源码://表示SelectableChannel在Selector中的注册的标记/句柄publicabstractclassSelectionKey{//构造该类的一个实例
  • 标签:KEY 源码 解析
SelectionKey源码解析

转载自:http://blog.csdn.net/robinjwong/article/details/41792623

注:
句柄:可以认为是对象身份的唯一id,标识应用程序中的不同对象和同类中的不同的实例。句柄不是指针,程序不能利用句柄来直接阅读文件中的信息。

解析jdk源码:
class="java" name="code">//表示SelectableChannel 在Selector中的注册的标记/句柄
public abstract class SelectionKey {

	//构造该类的一个实例。
    protected SelectionKey() { }
	
	//返回创建此键的通道。即使在键被取消后,该方法将仍然返回通道。
    public abstract SelectableChannel channel();

	//返回创建此键的选择器。该方法将在取消键后,继续返回选择器。
    public abstract Selector selector();

	//说明此键是否有效。key在创建时是有效的,直到它被取消,其通道关闭,或其选择器关闭。
    public abstract boolean isValid();

	/**
	 *请求用选择器注册这个密钥的通道。
	 *被取消。在返回时,key将无效并将一直存在。
     *添加到选择器的取消键集中。
     *在下一次选择操作中所有选择器的键集将被移除。
     *如果这个键已经被取消了,那么调用这个方法就没有影响。一旦取消,key将永远无效。
     *这个方法可以在任何时候调用。它同步选择器的取消键集,因此在调用时可能会阻塞。
	 *与取消或选择有关的操作同时进行。
	 */
    public abstract void cancel();

	/**检索此键的兴趣集。(既SelectionKey选择的4个监听key)
	 *保证返回的集合只包含对该密钥通道操作有效的位。这个方法可以在任何时候调用。
	 *不管它是否阻塞,以及实现依赖的时间长短。
     */
	public abstract int interestOps();

	/**
	 *将此键的兴趣设置为给定值。这个方法可以在任何时候调用。
	 *不管它是否阻塞,以及实现依赖的时间长短。
	 */
    public abstract SelectionKey interestOps(int ops);

    //检索此键的已操作集。
    public abstract int readyOps();

    /**
     *操作设置位用于读取操作。
     *假设一个选择键的兴趣集包含OP_READ。如果选择器
	 *检测到对应的通道已准备好读取,已经到达。
	 *结束流,已被远程关闭以供进一步阅读或使用。
	 *在未处理的情况下,它将添加OP_READ到关键字。
	 *已经操作的集合,并将键添加到它的选择键。
	 */
    public static final int OP_READ = 1 << 0;

	//写操作
    public static final int OP_WRITE = 1 << 2;

	//客户端请求连接服务端
    public static final int OP_CONNECT = 1 << 3;

	//服务端请求连接客户端
    public static final int OP_ACCEPT = 1 << 4;

    /**
     *测试此键的通道是否可以读取。
     *如不支持读取操作,则返回false。
     */
    public final boolean isReadable() {
        return (readyOps() & OP_READ) != 0;
    }

    //测试此键的通道是否可以写入。
    public final boolean isWritable() {
        return (readyOps() & OP_WRITE) != 0;
    }

	//测试此键的通道是否可以连接。
    public final boolean isConnectable() {
        return (readyOps() & OP_CONNECT) != 0;
    }
	
	//测试此键的通道是否可以连接。
    public final boolean isAcceptable() {
        return (readyOps() & OP_ACCEPT) != 0;
    }
    
    private volatile Object attachment = null;

    private static final AtomicReferenceFieldUpdater<SelectionKey,Object>
        attachmentUpdater = AtomicReferenceFieldUpdater.newUpdater(
            SelectionKey.class, Object.class, "attachment"
        );

	//将给定对象连接到此键。
    public final Object attach(Object ob) {
        return attachmentUpdater.getAndSet(this, ob);
    }
	
	//检索当前的附件。
    public final Object attachment() {
        return attachment;
    }

}
上一篇: java 比较两个对象是否一致 下一篇: 没有下一篇了!
发表评论
用户名: 匿名