美文网首页Java 杂谈java程序员
第二节 netty前传-NIO简介

第二节 netty前传-NIO简介

作者: 勃列日涅夫 | 来源:发表于2018-10-15 22:12 被阅读24次

    Java NIO是Java的替代IO API(从jdk1.4开始),意味着替代标准Java IO和Java 网络API。 Java NIO提供了与标准IO API不同的使用IO的方式。
    java nio有三大核心部分分别是Channel,Buffer 和 Selector 构成了核心的API。其它组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。下面对先对这三个核心部分简单介绍

    • Java NIO: Channels and Buffers

    在标准java的IO API中,使用字节流和字符流。而在NIO中,使用是通道(Channels )和缓冲区(Buffers)。 数据总是从通道读入缓冲区,或从缓冲区写入通道

    • Java NIO: Non-blocking IO

    Java NIO能够执行非阻塞IO。 例如,线程可以要求通道将数据读入缓冲区。 当通道将数据读入缓冲区的过程中,线程可以执行其他操作。 一旦数据已被读入缓冲区,线程就可以继续处理它。 将数据写入通道也是如此。

    • Java NIO: Selectors

    Java NIO包含 “选择器(Selectors)” 的概念。 Selectors是一个可以监视多个事件通道的对象(例如:连接打开,数据到达、数据读写等)。 因此,单个线程可以监视多个通道的数据。就是nio的多路复用


    Buffer

    NIO中的关键Buffer实现有:

    • ByteBuffer
    • CharBuffer
    • DoubleBuffer
    • FloatBuffer
    • IntBuffer
    • LongBuffer
    • ShortBuffer
      分别对应基本数据类型: byte, char, double, float, int, long, short。当然NIO中还有 HeapByteBuffer, DirectByteBuffer表示堆内存和直接内存(少了从系统到虚拟机之间数据的复制操作,所以更快效率更高,但是由于直接内存不由jvm管理所以也更容易出现内存泄漏。)
      之后会单独对详细介绍

    Channel

    Channel和IO中的Stream(流)是差不多一个等级的。不过Stream是单向的,如:InputStream, OutputStream.而Channel是双向的,既可以用来进行读操作,又可以用来进行写操作。
    NIO中的Channel的主要实现有:

    • FileChannel
    • DatagramChannel
    • SocketChannel
    • ServerSocketChannel
      从上述的名字就可以猜出:分别对应的是文件IO、UDP和TCP(Server和Client)。

    Selector

    Selector就是上面介绍的选择器。在运行单线程可以处理多个Channel,如果一个应用打开了多个通道,但每个连接的流量都很低(本质上表示每个连接处理很短暂,很快就断开了),使用Selector就会很方便。例如一个消息中间件,在监听某个
    topic可类比。通过使用Selector, 在向Selector注册相应的Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪(有消息推送过来)。一旦这个方法返回,线程就可以处理这些事件。

    具体例子使用见下一节

    相关文章

      网友评论

        本文标题:第二节 netty前传-NIO简介

        本文链接:https://www.haomeiwen.com/subject/cwfsaftx.html