Java中网络IO的实现方式(BIO、NIO、AIO)介绍

 更新时间:2017年03月17日 09:51:47   投稿:lqh  
这篇文章主要介绍了Java中网络IO的实现方式(BIO、NIO、AIO)介绍的相关资料,需要的朋友可以参考下

在网络编程中,接触到最多的就是利用Socket进行网络通信开发。在Java中主要是以下三种实现方式BIO、NIO、AIO。

关于这三个概念的辨析以前一直都是好像懂,但是表达的不是很清楚,下面做个总结完全辨析清楚。

1. BIO方式

首先我用一个较为通俗的语言来说明:

BIO 就是阻塞IO,每个TCP连接进来服务端都需要创建一个线程来建立连接并进行消息的处理。如果中间发生了阻塞(比如建立连接、读数据、写数据时发生阻碍),线程也会发生阻塞,并发情况下,N个连接需要N个线程来处理。
这种方式的缺点就是:并发情况下效率很低。

下面用一个图示来说明BIO的工作情况

2. NIO方式

NIO是JDK1.4提出的,还是先用一段通俗的话来说明NIO的工作原理:

NIO 也就是非阻塞IO,是基于事件驱动的思想(Reactor线程模型)。对比与BIO来说,NIO使用一个线程来管理所有的Socket 通道,也就是基于Selector机制,当查询到事件时(连接、接受连接、读、写),就会转发给不同的处理线程(handler)。

下面给出Reactor模型的工作应用图:

3. AIO方式

AIO是JDK1.7提出的,也就是异步IO。AIO采用的是Proactor模式。我们首先应该辨析的是AIO和NIO的区别:

(1)NIO的通知是发生在Handler之前;
(2)AIO的通知是发生在读写等处理之后的回调,有通知时表示相关操作已经结束了。

AIO在进行读写操作时,只需要调用相应的read/write方法,并传入CompletionHandler(动作完成时处理器),在动作完成后会调用CompletionHandler。 NIO的通知是发生在动作之前,是在可读可写的时候,Selector发现了这些事件后就通知并调用Handler处理,

下面给出Proactor模式的工作流程图:

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • 通俗讲解JVM的类加载机制

    通俗讲解JVM的类加载机制

    这篇文章主要介绍了JVM的类加载机制的相关资料,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-09-09
  • 浅谈Java线程间通信方式

    浅谈Java线程间通信方式

    这篇文章主要为大家详细介绍了Java线程间的通信方式,以代码结合文字的方式来讨论线程间的通信,感兴趣的朋友可以参考一下
    2021-11-11
  • Java的Hibernate框架中Criteria查询使用的实例讲解

    Java的Hibernate框架中Criteria查询使用的实例讲解

    这篇文章主要介绍了Java的Hibernate框架中Criteria查询使用的实例讲解,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2016-01-01
  • 理解zookeeper选举机制

    理解zookeeper选举机制

    本文主要介绍了zookeeper选举机制的相关知识,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • SpringBoot2.3集成ELK7.1.0的示例代码

    SpringBoot2.3集成ELK7.1.0的示例代码

    这篇文章主要介绍了SpringBoot2.3集成ELK7.1.0的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • IDEA在一个项目空间下管理多个项目的操作方法

    IDEA在一个项目空间下管理多个项目的操作方法

    这篇文章主要介绍了IDEA如何在一个项目空间下管理多个项目,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Java中的BufferedInputStream与BufferedOutputStream使用示例

    Java中的BufferedInputStream与BufferedOutputStream使用示例

    BufferedInputStream和BufferedOutputStream分别继承于FilterInputStream和FilterOutputStream,代表着缓冲区的输入输出,这里我们就来看一下Java中的BufferedInputStream与BufferedOutputStream使用示例:
    2016-06-06
  • JavaSE一维数组和二维数组用法详解

    JavaSE一维数组和二维数组用法详解

    数组存储同一种数据类型多个元素的集合,既可以存储基本数据类型,也可以存储引用数据类型,这篇文章主要给大家介绍了关于JavaSE一维数组和二维数组用法的相关资料,需要的朋友可以参考下
    2024-04-04
  • java由JABXContext注解读取xml配置文件方式

    java由JABXContext注解读取xml配置文件方式

    这篇文章主要介绍了java由JABXContext注解读取xml配置文件方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 关于idea刚打开时疯狂报错的问题

    关于idea刚打开时疯狂报错的问题

    这篇文章主要介绍了关于idea刚打开时疯狂报错的问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04

最新评论