java中IO模型-AIO模型

article/2025/9/13 20:18:46

AIO模型介绍

AIO(Asynchronous I/O) 异步非阻塞模型, 在javajdk.17版本开始支持AIO,AIO模型需要操作系统的支持。
AIO最大的特性是异步能力,对socket和I/O起作用。
在这里插入图片描述
异步IO模型类似的
与NIO模型不同,读写操作为例,只需直接调用read和write的API即可,这方法都是异步的。
对于读操作:当有流可读是,系统会将可读的流传入到read方法的缓冲区,并通知应用程序。
读写都是异步的,完成之后会主动调用回调函数。

在JDK 1.7中,nio.2,主要在java.nio.channels包下新增了四个异步通道AsynchronousSocketChannel:异步操作TCP通道,主要连接AsynchronousServerSocketChannel,一般在客户端实现。
AsynchronousServerSocketChannel:异步操作TCP通道,主要接收客户端的连接,一般在服务端实现。
AsynchronousFileChannel:操作文件的。
AsynchronousDatagramChanel:异步操作UDP的通道。

AsynchronousServerSocketChannel:AIO中网络通信服务端的socket

AIO中实现方法,以accept方法为例
由于异步IO实际IO操作是交给操作系统来做,应用程序只负责同志操作系统进行IO和接口操作系统IO完成的通知,所以异步的accept的方法调用是不会阻塞的。

异步IO中有两种实现方式:

1、future方法

Future accept();

提交一个IO操作请求(Accept/read/write),返回future,就可以对future进行检车,future.get()方法,future方法会让用户程序阻塞直至操作正常完成,使用future方法比较简单,但是future.get()是同步的,使用该方式恒荣进入到同步的编程模式,这种让是会是AIO的异步操作成为摆设。

2、callback回调方式

void accept(A attachment, CompletionHandler<AsynchronousSocketChannel,? super A> handler)

开始接收客户端的连接,连接成功或者失败都是触发CompletionHandler对象的响应方法,
CompletionHandler接口提供了两个方法:
void completed(V result, A attachment);当IO完成时触发该方法,该方法的第一个参数代表IO操作的返回的对象,第二个参数代表发起IO操作时传入的附加参数
void failed(Throwable exc, A attachment);当IO失败是触发的该方法,第一个参数表示IO操作失败引引起的异常或者是错误。

即提交一个IO操作请求(Accept/read/write),指定一个CompletionHandler,当异步IO操作完成时,发送一个通知,这个时候CompletionHandler对象的completed或者failed方法将会被调用。

AIO的实现需要充分调用操作系统参数,IO需要操作系统的支持,并发也同样需要操作系统的支持,所以性能方面不同的操作系统差异会比较明显。

AIO 的回调方式编程

/*** desc:AIO服务端代码* @user:西财彭于晏* @date:2021/9/22*/public class Server {public static void main(String[] args) {try {//创建服务端通道AsynchronousServerSocketChannel asynchronousServerSocketChannel = AsynchronousServerSocketChannel.open();//绑定端口asynchronousServerSocketChannel.bind(new InetSocketAddress(6666));System.out.println("服务端启动");//接收客户端连接 accept 接收操作是异步操作asynchronousServerSocketChannel.accept(null, new AcceptComplationHandler(asynchronousServerSocketChannel));//BIO accept操作返回Socket实例  Socket socket= serversocket.accept();//AIO accept操作返回AsynchronousSocketChannel//accept是异步操作,防止当前程序直接执行结束//方法1:while(true)+sleepwhile (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}} catch (IOException e) {e.printStackTrace();}}
}/*** desc:接收连接accept的回调* //BIO accept操作返回Socket实例  Socket socket= serversocket.accept();* //AIO accept操作返回AsynchronousSocketChannel* @user:西财彭于晏* @date:2021/9/22*/public class AcceptComplationHandler implements CompletionHandler<AsynchronousSocketChannel,Object> {private AsynchronousServerSocketChannel channel;public AcceptComplationHandler(AsynchronousServerSocketChannel channel) {this.channel = channel;}@Overridepublic void completed(AsynchronousSocketChannel result, Object attachment) {System.out.println("有新客户的连接");//完成accept连接IO操作//读写操作,需要使用Buffer,和NIO比较,当前AIO称之为NIO.2//创建新的bufferByteBuffer byteBuffer = ByteBuffer.allocate(1024);//读客户端数据,读操作是异步操作,需要实现CompletionHandler对象/*** <A> void read(ByteBuffer dst,A attachment,CompletionHandler<Integer,? super A> handler);* 读操作异步方式方法解读* 第一个参数:dst  数据读取的目的地* 第二个参数:attachment  给读回调传递的额外信息* 第三个参数:CompletionHandler 当读数据完成后CompletionHandler对象*/result.read(byteBuffer,byteBuffer,new ReadCompletionHandler(result));//再次接收其他的客户端连接的channel.accept(null,new AcceptComplationHandler(channel));}@Overridepublic void failed(Throwable exc, Object attachment) {}
}/*** desc:AIo的读操作的回调* 读操作的结果为读取的数据的个数* @user:西财彭于晏* @date:2021/9/22*/public class ReadCompletionHandler implements CompletionHandler<Integer,ByteBuffer> {//用户接受或者发送操作的channelprivate AsynchronousSocketChannel asynchronousSocketChannel;public ReadCompletionHandler(AsynchronousSocketChannel channel) {this.asynchronousSocketChannel = channel;}@Overridepublic void completed(Integer result, ByteBuffer attachment) {//读数据完成后//数据已经完成并写入到ByteBuffer类型的变量resultattachment.flip();byte[] bytes = new byte[attachment.remaining()];attachment.get(bytes);String msg = null;try {msg = new String(bytes,"UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}System.out.println("服务端接收数据:"+msg);attachment.clear();//重复接收消息,再次调用异步读操作this.asynchronousSocketChannel.read(attachment,attachment,new ReadCompletionHandler(this.asynchronousSocketChannel));}@Overridepublic void failed(Throwable exc, ByteBuffer attachment) {}
}
  //创建异步通道实例AsynchronousSocketChannel asynchronousSocketChannel = AsynchronousSocketChannel.open();//连接服务端,异步方式asynchronousSocketChannel.connect(new InetSocketAddress("127.0.0.1",6666),asynchronousSocketChannel,new ConnetionComplateHandler());ByteBuffer byteBuffer = ByteBuffer.allocate(1024);//写操作Scanner scanner = new Scanner(System.in);while (scanner.hasNext()) {String msg = scanner.nextLine();if (msg != null && !"".equals(msg.trim())) {byteBuffer.put(msg.getBytes());byteBuffer.flip();asynchronousSocketChannel.write(byteBuffer);byteBuffer.clear();}}} catch (IOException e) {e.printStackTrace();}public class ConnetionComplateHandler implements CompletionHandler<Void,AsynchronousSocketChannel> {@Overridepublic void completed(Void result, AsynchronousSocketChannel attachment) {//连接服务端成功System.out.println("连接服务端成功");}@Overridepublic void failed(Throwable exc, AsynchronousSocketChannel attachment) {}
}

BIO、NIO、AIO的比较

在这里插入图片描述

1、释义

BIO:同步阻塞IO模型

在JDK1.4之前网络通信使用的都是BIO模型,BIO模型中accept()、read()、write()、Connection()都会阻塞,BIO要同时支处理多个客户端的连接,就必须使用多线程,即每次accept阻塞等待客户端连接对象socket,为每一个socket创建一个线程。
采用多线程范式使得BIO具备了高并发能力,即同时处理多客户端连接请求,但带来新问题,随着开启线程数量增多,会消耗过多的内存资源,导致服务器变慢甚至崩溃。

NIO:同步非阻塞IO模型

采用了事件驱动的思想实现了一个多路复用器,由复用器来同时监听多个事件是否准备就绪。
一个selector复用器同时可以监听多个客户端的连接及IO操作,一个selector复用器只需要一个线程处理即可,即NIO能实现一个线程来管理多个客户端连接,NIO主要处理的是有效的连接。

AIO:异步非阻塞IO模型

在JDK1.7之后提供了异步的相关通道实例,AIO提供的最大的特点是具备异步功能,需要借助操作系统,底层操作系统具有异步IO模型,
异步操作的实现是在对应的read/write/accept/connection等方法异步执行,完成后会主动调用回调函数,实现一个CompletionHandler对象。

应用场景

BIO:BIO方式适用于连接数量少且固定的场景,这种方式对服务器资源要求比较高, JDK1.4之前唯一的选择,程序直观简单易理解。
NIO:适用于连接数目多且业务比较轻,比如:聊天服务器 JDK1.4开始支持NIO。
AIO:适用于连接数目多且连接比较长(业务重操作),需要操作系统充分参与并发操作 JDK1.7开始支持。

实现:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/sW6Ul73Y.shtml

相关文章

架构解密从分布式到微服务:深入理解网络,AIO

AIO AIO是I/O模型里一个很高的层次&#xff0c;体现了大道至简的软件美学理念。与NIO相比&#xff0c;AIO的框架和使用方法相对简单很多。 AIO包括两大部分:AIO Files解决了文件的异步处理问题&#xff0c;AIO Sockets解决了Socket的异步处理问题。AIO的核心概念为应用发起非…

BIO,NIO,AIO区别

BIO,NIO,AIO 总结 Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候&#xff0c;不需要关心操作系统层面的知识&#xff0c;也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。 在讲 BIO,NIO,…

Apache CXF - 快速指南

Apache CXF - 简介 在当今的环境中&#xff0c;您可以使用多个选项来创建 Web 服务应用程序。您可以使用多种标准和广泛接受的协议中的一种或多种进行通信。例如SOAP、XML/HTTP、RESTful HTTP和CORBA&#xff08;通用对象请求代理架构&#xff0c;在过去非常流行&#xff0c;但…

java cxf 安全_CXF client在并发下的线程安全问题

这个是发生在上周周末的真实案例&#xff0c;因为cxf client 端线程安全导致的错误&#xff0c;总结出来希望其他使用cxf的兄弟注意。 首先描述一下背景&#xff0c;简单的说就是使用cxf作为web service的客户端&#xff0c;运行在weblogic上&#xff0c;连接外部的服务器。为了…

linux cxf服务端,Apache CXF 框架应用实战

一、概述 Apache CXF提供了用于方便地构建和开发WebService的可靠基础架构。它允许创建高性能和可扩展的服务&#xff0c;可以部署在Tomcat和基于Spring的轻量级容器中&#xff0c;也可以部署在更高级的服务器上&#xff0c;例如Jboss、WebSphere或WebLogic。 CXF提供了以下功能…

使用CXF调用WSDL

简介 时隔多年&#xff0c;再次遇到需要调用WebService的业务&#xff0c;对方给予的wsdl说明文档还是内网的链接&#xff0c;并且设有基础访问权限&#xff0c;即在浏览器打开wsdl链接时需要输入【用户名密码】登录后方可查看wsdl文档&#xff0c;这需要设置代理&#xff08;我…

spring5.x cxf3.4.x 服务端和客户端 非maven版本

文章目录 一、资料准备1. 官网链接2. 解压3. 依赖梳理 二、spring集成cxf2.1.创建spring项目2.2. 创建接口2.3. impl2.4. spring-cxf.xml2.5. 客户端2.6. 开源项目 一、资料准备 1. 官网链接 http://cxf.apache.org/download.html 下载apache-cxf-3.4.5.zip 2. 解压 3. 依赖…

CXF实现WebService

一、CXF简介 Apache CXF Celtix XFire&#xff0c;开始叫 Apache CeltiXfire&#xff0c;后来更名为 Apache CXF 了&#xff0c;以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华&#xff0c;提供了对 JAX-WS 全面的支持&#xff0c;并且提供了多种 Binding …

SpringBoot2 整合 CXF 服务端和客户端

文章目录 一、CXF服务端1. 导入依赖2. 创建service接口3. 接口实现类4. cxf配置类5. 查看wsdl结果 二、CXF客户端2.1. 客户端2.2. 断点调试2.3. 发起调用服务开源源码. 一、CXF服务端 1. 导入依赖 <properties><cxf.version>3.3.1</cxf.version></proper…

CXF客户端乱码

CXF客户端乱码 解决办法一&#xff0c;设置服务端代码&#xff1a; 在使用CXF与其他系统对接时&#xff0c;发现对方系统响应的汉字乱码&#xff0c;使用soapui调用测试就没有问题&#xff0c;但是程序里面调用就乱码&#xff0c;很奇怪&#xff0c;乱码如下&#xff1a; 由…

SpringBoot集成CXF

CXF入门篇https://blog.csdn.net/tongxin_tongmeng/article/details/126482362Server端项目结构 Server端pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"…

走进cxf

一、什么是cxf 有很多人认为cxf就是webservice&#xff0c;其实cxf只是发布调用webservice的工具而已 Apache CXF Celtix Xfire&#xff0c;开始叫 Apache CeltiXfire&#xff0c;后来更名为 Apache CXF 了&#xff0c;以下简称为 CXF。Apache CXF 是一个开源的 web Service…

NewSQL ---- Mysql.8.0 与 MemSQL 7.0 大数据量查询性能对比

目录 1测试环境以及测试用例设计 1.1测试环境 1.2测试用例设计 2 千万级数据量性能测试对比 2.1 MemSQL时间范围分页查询 2.1.1 性能测试数据 2.2任务信息查询 2.2.1 性能测试数据 2.3 执行批次范围查询 2.3.1 性能测试数据 2.4 批次任务查询 2.4.1 性能测试数据 …

memsql架构2

接上次的MemSQL分布式架构介绍(一)&#xff0c;原文在这里&#xff1a;http://docs.memsql.com/latest/concepts/distributed_architecture/ 首先上张图&#xff0c;是我根据自己的理解画的&#xff0c;如有错误还请大家指出 几个概念 1、MemSQL有两种类型的表&#xff1a; ref…

MemSQL性能测试结果

1.查询的SQL select count(subie.user_id) as count from sum_user_basic_info_exp subie join sum_user_lend_info_exp sulie on sulie.user_idsubie.user_id where subie.curr_user_role_cd1 and subie.reg_dt >2016-08-29 and subie.reg_dt <2016-08-29 结…

【MySQL】SQL优化

SQL优化 1 插入数据 1.1 insert优化 如果我们需要一次性往数据库表中插入多条记录&#xff0c;可以从以下三个方面进行优化。 insert into tb_test values(1,tom); insert into tb_test values(2,cat); insert into tb_test values(3,jerry); .....1.批量插入数据 Insert…

MySQL慢SQL探究

文章目录 前言1、慢SQL捕获慢查询追踪配置方式 2、情况分析为什么查询会慢&#xff1f; 2.1 SQL执行计划分析explain执行计划分析PROFILE分析OPTIMIZER_TRACE分析 3、引擎参数配置分析I/O性能分析MySQL I/O参数 其他原因分析网络抖动单表数据量过大 总结 前言 我们在日常开发中…

【Mysql】SQL性能分析

【Mysql】SQL性能分析 文章目录 【Mysql】SQL性能分析1. SQL执行频率2. 慢查询日志3. profile详情4. explain 1. SQL执行频率 在控制台中通过命令 show [session|global] status 命令可以提供服务器状态信息。通过如下指令&#xff0c;可以查看当前数据库的 insert,update,del…

MemSQL可以为时间序列应用做些什么

版权声明&#xff1a;本文由腾讯云数据库产品团队整理&#xff0c;页面原始内容来自于db weekly英文官网&#xff0c;若转载请注明出处。翻译目的在于传递更多全球最新数据库领域相关信息&#xff0c;并不意味着腾讯云数据库产品团队赞同其观点或证实其内容的真实性。如果其他媒…

MySQL-SQL优化

文章目录 一、插入数据1、insert2、大批量插入数据 二、主键优化&#xff08;1&#xff09;数据组织方式&#xff08;2&#xff09;页分裂&#xff08;3&#xff09;页合并&#xff08;4&#xff09;索引设计原则 三、order by优化四、group by优化五、limit优化六、count优化1…