`

API笔记之java.nio.channels.SelectionKey

    博客分类:
  • Java
阅读更多

API笔记之java.nio.channels.SelectionKey

 

import java.nio.channels.SelectableChannel;
import java.nio.channels.Selector;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;

/**
 * A token representing the registration of a {@link SelectableChannel} with a
 * {@link Selector}.
 * 
 * A token representing the registration of a SelectableChannel with a Selector. 
 * 一个SelectoableChannel在Selector中注册之后就产生一个SelectionKey对象,表示我们对这个SelectoableChannel的什么事件感兴趣,当然
 * SelectionKey的interestOps是我们自己传进去的, 我们调用selector的selectedKey方法会返回被选中的SelectionKey集,通过这个key判断
 * 什么事件,然后通过channel()方法进行io操作
 */

public abstract class SelectionKey {
	/**
	 * 四种事件用一个int(intrestOps)变量表示(其实byte也够了?)
	 * 	bits: [0|1]	   [0|1]   [0|1]	[0|1] 
	 * means: accept  connect  write    read
	 * 想要哪几种事件,就对这些事件的值进行或运算,得出的就是intrestOps
	 *比如 interestOps = 2(0010),该key会被选中, 事件是write, 主线逻辑拿得到这个key对应的channel可以进行写操作
	 */
	/**
     * 当selector发现: 
     * 1.channel有数据可读
     * 2.channel has been remotely shut down for further reading(不能100%确定其意思,猜测是channel的读通道关闭)
     * 3.channel has an error pending,有错误待处理?
     * 时, selector就会把该key加到selected key set中
     */
    public static final int OP_READ = 1 << 0;

    /**
     *这三个和上面差不多
     */
    public static final int OP_WRITE = 1 << 2;
    public static final int OP_CONNECT = 1 << 3; // 这个只有SocketChannel才有
    public static final int OP_ACCEPT = 1 << 4; // 这个只有ServerSocketChannel才有

    /**
     * 不给外部new实例, 在SelectionKeyImpl中会开放这个构造方法给包内的lei使用
     */
    protected SelectionKey() { }

    /**
     * Returns the channel for which this key was created.  This method will
     * continue to return the channel even after the key is cancelled.
     */
    public abstract SelectableChannel channel();

    /**
     * Returns the selector for which this key was created.  This method will
     * continue to return the selector even after the key is cancelled.
     */
    public abstract Selector selector();

    /**
     * Tells whether or not this key is valid.
     *
     * 当key被创建开始就是valid的,直到以下情况发生:
     * 1.cancel()方法被调用
     * 2.它对应的channel的被close
     * 3.它对应的selector被close
     */
    public abstract boolean isValid();

    /**
     * Requests that the registration of this key's channel with its selector
     * be cancelled.  
     * 被调用后,该key就是invalid的了,会被加到对应的selector的cancelled key set中,当selector的下一次选择操作时, 
     * 该key就会被移除(selector的三种key set)
     */
    public abstract void cancel();

    /**
     * Retrieves this key's interest set.
     */
    public abstract int interestOps();

    /**
     * Sets this key's interest set to the given value.
     */
    public abstract SelectionKey interestOps(int ops);

    /**
     * Retrieves this key's ready-operation set.
     */
    public abstract int readyOps();

    /**
     * Tests whether this key's channel is ready for reading.
     */
    public final boolean isReadable() {
        return (readyOps() & OP_READ) != 0;
    }

    /**
     * Tests whether this key's channel is ready for writing.
     */
    public final boolean isWritable() {
        return (readyOps() & OP_WRITE) != 0;
    }

    /**
     * Tests whether this key's channel has either finished, or failed to
     * finish, its socket-connection operation.
     */
    public final boolean isConnectable() {
        return (readyOps() & OP_CONNECT) != 0;
    }

    /**
     * Tests whether this key's channel is ready to accept a new socket
     * connection.
     */
    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"
        );

    /**
     * Attaches the given object to this key.
     */
    public final Object attach(Object ob) {
        return attachmentUpdater.getAndSet(this, ob);
    }

    /**
     * Retrieves the current attachment.
     */
    public final Object attachment() {
        return attachment;
    }

}

 

分享到:
评论

相关推荐

    Java.NIO资源下载资源下载

    - **Channels 工具类**:介绍了 Java NIO 提供的一些工具类,用于简化 Channel 的使用。 #### 3. Selector(选择器) - **Selector 基础**:介绍了 Selector 的基本概念及工作原理。 - **使用 SelectionKey**:...

    Java.nio 与Java.io比较

    4. **API设计**:Java.nio的API设计更加面向对象,提供了更丰富的功能集和更灵活的控制机制。 总之,Java.nio与Java.io各有优势,在不同的场景下应选择最适合的技术。对于需要高性能、高并发的应用,Java.nio是更好...

    java NIO.zip

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统的I/O模型的新技术。自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发...

    Java.nio

    Java.nio,全称为Java Non-blocking Input/Output,是Java平台从1.4版本开始引入的一套全新的I/O API,旨在替代传统的Java.io流API。它提供了更高效、更灵活的I/O操作方式,特别是在处理大量并发连接时,性能显著...

    优雅的操作文件:java.nio.file 库介绍.pdf

    `java.nio.file`库的引入使得Java在文件操作方面有了质的飞跃,它简化了API,提高了性能,并提供了更多现代文件系统所需的功能。无论是处理小文件还是大文件,无论是单线程还是多线程环境,`java.nio.file`都能提供...

    java org.apache.http.nio jar包

    找了好久,终于找到了,java刷新同步获取网络资源

    java.nio API详解

    5. `java.nio.channels.spi`:类似的,这个包提供了Channel和Selector的SPI,用于扩展NIO API。 ByteBuffer是NIO中的关键类,它与其他类型的Buffer(如CharBuffer、IntBuffer等)一样,具有capacity、limit和...

    JDK1.7 之java.nio.file.Files 读取文件仅需一行代码实现

    JDK1.7 之 java.nio.file.Files 读取文件仅需一行代码实现 java.nio.file.Files 类是 JDK1.7 中引入的新的文件操作类,该类包含了许多有用的方法来操作文件。其中,Files.readAllBytes(Path) 方法可以将整个文件...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的编程示例。NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许...

    java.io:clojure.java.io 的 JK7 java.nio.file.Path 兼容性

    java.io clojure.java.io 的 JK7 java.nio.file.Path 兼容性依赖信息该库托管在 Releases 上。 依赖: [me.moocar/java.io " 0.1.0 " ]用法是 JDK7 中引入的文件路径的抽象。 这个库提供了和 Paths 之间的兼容性。 ...

    java NIO详细教程

    Java NIO 的设计目的是为了克服传统Java IO API在面对大量并发连接时存在的性能瓶颈。 ##### 使用背景 传统的Java IO模型基于流(Stream),每次读写操作都是阻塞式的,即在读写操作完成之前,当前线程会被挂起等待...

    The_Study_about_Java.nio.rar_java nio

    Java NIO,全称为New Input/Output,是Java在1.4版本引入的一个新的I/O API,用于替代标准的Java IO API。这个新的API提供了一种不同于传统阻塞I/O模型的非阻塞I/O处理方式,使得在处理高并发、大数据传输场景时性能...

    Apress.Pro.Java.7.NIO.2.2011

    《Apress.Pro.Java.7.NIO.2.2011》这本书专注于讲解Java 7中的非阻塞I/O(Non-blocking I/O, NIO)和NIO 2的高级特性,是Java开发者深入理解这一关键领域的重要参考资料。NIO在Java平台中扮演着至关重要的角色,特别...

    nio:Clojure对java.nio的支持

    o Clojure对java.nio的支持。 将clojure.java.io的输入流,输出流和复制功能扩展到java.nio类。 定义新的强制功能缓冲区,字节缓冲区,字符缓冲区,双缓冲区,浮点缓冲区,整数缓冲区,长缓冲区,短缓冲区,通道,可...

    Java jdk api 1.8_google.CHM JDK API 1.8谷歌翻译中文版在线参考手册

    在JDK API中,`java.util`包是核心的类库之一,包含了大量用于处理集合、日期时间、泛型和并发等任务的类。例如,`ArrayList`和`HashMap`是两种常用的容器,分别用于存储有序和键值对的数据。`Collections`类提供了...

    java.nio(socket异步通讯完整版)

    重新写的Java.nio的socket异步通讯,包含客户端及服务端完整版, 注:解析信息CLASS及进制转换CLASS需要自己去写,项目直接导入,需要自己写一些解析及转换类,这样你才能读懂SOCKET的异步,否则光拿代码没用 ...

    java.NIO与Files工具类(处理方案示例).md

    java.NIO与Files工具类(处理方案示例).md

Global site tag (gtag.js) - Google Analytics