`

API笔记之java.nio.channels.Selector

    博客分类:
  • Java
阅读更多

API笔记之java.nio.channels.Selector

import java.io.Closeable;
import java.io.IOException;
import java.nio.channels.spi.SelectorProvider;
import java.util.Set;


/**
 * 
 * A multiplexor of {@link SelectableChannel} objects.
 * <pre>
 *                      Selector
 *                         ^
 * ________________________|________________________________
 *    |          |                     |               |
 *   ...    SelectionKey          SelectionKey        ...
 *               |                     |
 *   ...   SelectableChannel     SelectableChannel    ...
 * 
 * 
 * 以下两种创建方式:
 * 1.调用Selector.open()
 * 2.调用java.nio.channels.spi.SelectorProvider.openSelector()
 * 
 * 有三种key set:
 * 1.registered key set. 已注册的键集
 * 2.selected key set, 已选择的键集, 之中每一个key的channel都至少准备好一种操作 
 * 3.cancelled key set, 已取消的键集, 调用SelectionKey.cancel()后, 那个SelectionKey
 * 就被加到这里, 在下一次select()/selectNow()/select(long)时, 该SelectionKey就会被移除.
 * <p>
 * select()/selectNow()/select(long)的过程:
 * 1.cancelled key set中的每个key都会从另两个key set中移除, 对应的通道也被注销, cancelled key set被清空。
 * 2.registered key set 中的key的inters集合将被检查, 在这个步骤中的检查执行完后, 对interst集合更改不会影响接下来的过程,
 *   接下来底层操作系统将进行查询, 以确定每个通道所关心的操作的真是就绪状态.系统调用完成后, 对那些还没准备好的通道将不会执行任何操作, 
 *   对那些已准备好的通道, 将执行以下两种操作之一:
 *   
 *   a.如果通道的键还没有处于已选择的键的集合, 那么键的ready集合将被清空, 然后表示操作系统发行的但钱通道已经准备好的操作的比特掩码将被设置.
 *   
 *   b.否则, 也就是在已选择的键的集合中, 键的ready集合将被表示操作系统发现的当前已经准备好的操作的比特掩码更新。所有之前的已经不再是就绪状
 *   态的操作不会被清除.事实上, 所有的比特位都不会被清理,由操作系统决定的ready集合是与之前的ready集合按位分离的, 一旦键被放置于选择器的
 *   已选择的键的集合中, 他的ready集合将是累积的,比特位只会被设置, 不会被清理.
 * 3.步骤2发生过程中, 有可能有些键被取消了, 因此在步骤2执行完后步骤1将再次执行, 以确保键已经被取消的通道的注销
 * 4.select操作返回的值是ready集合在步骤2中被修改的键的数量, 而不是已选择的键的集合中的通道的数量. 返回值不是已准备好的通道的总数, 而是
 *   是从上一个select()调用之后进入就绪状态的通道的数量。之前的调用中就绪的, 并且在本次调用中依然就绪的不会被计入, 而那些在前一次调用中已经
 *   就绪但现在已经不处于就绪的通道也不会被计入,这些通道可能仍然在已选择的键的集合中, 但不会被计入返回值.
 *</p> 
 *<p>
 * 有三个选择的方法select()、select(long)和selectNow(), 前两个会阻塞当前线程, 而在这阻塞过程中, 有三种方法可以使线程退出阻塞状态:
 * 1.Selector.wakeup()方法, 使选择器上的第一个还没有返回的选择操作立即返回,如果当前没有进行中的选择操作, 那下一次select()方法的一种
 *   形式的调用将立即返回. 后面的选择操作正常执行
 * 2.Selector.close()方法. 任何一个在选择操作中阻塞的线程都将被唤醒, 与选择器相关的通道将被注销, 而键被取消
 * 3.Thread.currentThread.interrupt(), 该阻塞是可以响应中断的.
 * 
 * </p>
 * </pre>
 */

public abstract class Selector implements Closeable {

    protected Selector() { }

    /**
     * Opens a selector.
     */
    public static Selector open() throws IOException {
        return SelectorProvider.provider().openSelector();
    }

    /**
     * Tells whether or not this selector is open.
     */
    public abstract boolean isOpen();

    /**
     * Returns the provider that created this channel.
     */
    public abstract SelectorProvider provider();

    /**
     * Returns this selector's registered-key set.
     */
    public abstract Set<SelectionKey> keys();

    /**
     * Returns this selector's selected-key set.
     */
    public abstract Set<SelectionKey> selectedKeys();

    /**
     * Selects a set of keys whose corresponding channels are ready for I/O
     * operations.不会阻塞
     */
    public abstract int selectNow() throws IOException;

    /**
     * Selects a set of keys whose corresponding channels are ready for I/O
     * operations.可能阻塞, 但最多阻塞 timeout ms
     */
    public abstract int select(long timeout)
        throws IOException;

    /**
     * Selects a set of keys whose corresponding channels are ready for I/O
     * operations.可能阻塞, 直到底层系统调用完成
     */
    public abstract int select() throws IOException;

    /**
     * Causes the first selection operation that has not yet returned to return
     * immediately.
     */
    public abstract Selector wakeup();

    /**
     * Closes this selector.
     */
    public abstract void close() throws IOException;

}

 

0
1
分享到:
评论

相关推荐

    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

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

    java NIO.zip

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

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

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

    java.nio API详解

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

    java org.apache.http.nio jar包

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

    Java_NIO类库Selector机制解析.doc

    Java_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.doc

    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),每次读写操作都是阻塞式的,即在读写操作完成之前,当前线程会被挂起等待...

    java nio Selector的使用-客户端

    在创建Selector时,可以使用`java.nio.channels.Selector.open()`方法。接着,我们可以使用`channel.configureBlocking(false)`将通道设置为非阻塞模式,然后调用`channel.register(selector, interestOps)`方法将...

    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`类提供了...

Global site tag (gtag.js) - Google Analytics