Java网络之BIO、NIO和AIO(一)

在说BIO、NIO和AIO以前,先说说Java io流,先附上Java IO 流类结构思惟导体:java

Reader(字符读取)、Writer(字符写出)、InputStream(字节读取)、OutputStream(字节写出),编程

按操做对象分类思惟导图:网络

IO是指对数据流的输入和输出,也称为IO流,IO流主要分为两大类,字节流和字符流。字节流能够处理任何类型的数据,如图片,视频等,字符流只能处理字符类型的数据,Java IO流设计到挺多类的,可是这些类实际上有必定的规律,批次之间的关系很是密切,Java IO流的40多个类都是由InputSteam/Reader和OutputStream/Writer派生出来的,因为咱们主要介绍的是BIO、NIO以及AIO,Java IO流只是稍微的点到为止,想详细料了解能够看看文章 来自Java技术前线关于Java IO流的介绍和总结,写的很是仔细了!并发

BIO

我本身总结了一下:框架

BIO全称是Blocking IO,是JDK1.4以前的传统IO模型,自己是同步阻塞模式,针对网络通讯都是一请求一应答的方式,虽然简化了上层的应用开发,但在性能和可靠性方面存在着巨大瓶颈,试想一下若是每一个请求都须要新建一个线程来专门处理,那么在高并发的场景下,机器资源很快就会被耗尽,固然,咱们能够经过线程池来优化这种状况,但即便是这样,仍然改变不了阻塞IO的根本问题。异步

NIO — “准备好了以后再告诉我”

因为BIO的缺点,致使Java在JDK1.0至JDK3.0中,网络通讯模块的性能一直是短板,因此不少人更倾向于使用C/C++开发高性能服务端。为了强化Java在服务端的市场,终于在JSR-51也就是JDK4.0的时候发布了Java NIO,能够支持非阻塞IO。并新增了java.nio的包,提供不少异步开发的API和类库,我本身对NIO作了简单的总结:async

AIO/NIO.2 — “读完了再通知我”(NIO的改进版本)

AIO是在NIO的基础上,提供了异步操做(asynchronized)。AIO是在IO操做完成后,再给线程发送通知,AIO就是完成不阻塞的,经过一个回调函数,等待IO完成后使用,AIO提供了一个异步通道:AsynchronousSocketChannel,此类的方法签名会有一个参数CompletionHandler,处理回调成功时或者失败时的结果,我本身梳理了一下:函数

如何选择?

        NIO提供了与传统BIO模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不一样的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持同样,比较简单,可是性能和可靠性都很差;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可使用同步阻塞I/O来提高开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发。高并发

为了更好的理解BIO、NIO、AIO三者的区别,咱们下面介绍一下同步和异步、阻塞和非阻塞以及Reactor模型和Proactor模型的概念,我作了如下总结:性能

同步和异步

阻塞和非阻塞

Reactor模型和Proactor模型

Reactor模型:

    - 应用程序在事件分离器注册 读就绪事件 和 读就绪事件处理器
    - 事件分离器等待读就绪事件发生
    - 读就绪事件发生,激活事件分离器,分离器调用 读就绪事件处理器(即:能够进行读操做了,开始读)
    - 读事件处理器开始进行读操做,把读到的数据提供给程序使用

Proactor模型

    - 应用程序在事件分离器注册 读完成事件 和 读完成事件处理器,并向操做系统发出异步读请求
    - 事件分离器等待操做系统完成读取
    - 在分离器等待过程当中,操做系统利用并行的内核线程执行实际的读操做,并将结果数据存入用户自定义缓冲区,最后通知事件分离器读操做完成
    - 事件分离器监听到 读完成事件 后,激活读完成事件的处理器读,读完成事件处理器 处理用户自定义缓冲区中的数据给应用程序使用

      同步和异步的区别就在于 读 操做由谁完成:同步的Reactor是指程序发出读请求后,由分离器监听到能够进行读操做时(须要得到读操做条件)通知事件处理器进行读操做,异步的Proactor是指程序发出读请求后,操做系统马上异步地进行读操做了,读完以后在通知分离器,分离器激活处理器直接取用已读到的数据。

以上就是 Java网络之BIO、NIO和AIO(一)的全部内容,本文主要介绍了Java里面IO模型的演变和发展,介绍了他们的特色,在想了解和掌握一个知识的前提需须要对该知识点概念上的理解,这也是Java在服务端领域大放异彩的一个重要缘由,了解这些知识以后,咱们再去学习高性能的Netty框架,将会更加容易。,Java网络之BIO、NIO和AIO(二)会对他们进行更深一步的介绍和实战,到后面的文章咱们也会对 t-io 网络编程框架作一个介绍,期待吧 !!!

相关文章
相关标签/搜索