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模式的工作流程图:

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

相关文章

  • Java Swing 只关闭当前窗体的实现

    Java Swing 只关闭当前窗体的实现

    这篇文章主要介绍了Java Swing 只关闭当前窗体的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • SSH框架网上商城项目第7战之整合Struts2和Json

    SSH框架网上商城项目第7战之整合Struts2和Json

    SSH框架网上商城项目第7战之整合Struts2和Json,打通EasyUI和Struts2之间的交互,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 快速了解JAVA中的Random()函数

    快速了解JAVA中的Random()函数

    这篇文章主要介绍了JAVA中的Random()函数的使用方法,文中代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Java实现求解一元n次多项式的方法示例

    Java实现求解一元n次多项式的方法示例

    这篇文章主要介绍了Java实现求解一元n次多项式的方法,涉及java高斯消元法处理矩阵运算解多项式的相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • idea打开运行配置java web项目的全过程

    idea打开运行配置java web项目的全过程

    这篇文章主要给大家介绍了关于idea打开运行配置java web项目的相关资料,有些时候我们用IDEA跑之前用eclipse中运行的项目的时候,总是不止所措,要不就是只展示html,要不就是不能部署成功,需要的朋友可以参考下
    2023-08-08
  • springMvc异步的DeferredResult long polling应用示例解析

    springMvc异步的DeferredResult long polling应用示例解析

    这篇文章主要为大家介绍了springMvc中DeferredResult的long polling应用示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • 如何在IDEA中快速解决Jar冲突详解

    如何在IDEA中快速解决Jar冲突详解

    相信很多同学在过去做项目都遇到过Jar冲突的问题,在本地环境没问题,一旦部署到测试或生产环境突然就启动报错,报类似classNotFound的Exception,本文详细整理了如何在IDEA中快速解决Jar冲突,需要的朋友可以参考下
    2021-06-06
  • Java 简化正则表达式的使用

    Java 简化正则表达式的使用

    本篇文章主要介绍了Java 简化正则表达式使用的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • 利用Kafka动态调整topic分区partition

    利用Kafka动态调整topic分区partition

    这篇文章主要介绍了利用Kafka动态调整topic分区partition问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • java-servlet-转发AND路径(详解)

    java-servlet-转发AND路径(详解)

    下面小编就为大家带来一篇java-servlet-转发AND路径(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10

最新评论