java BIO、NIO、AIO用法样例

1. BIO (Blocking I/O) - 同步阻塞 I/O

BIO 是传统的网络编程模型,每个连接对应一个线程,当线程执行读/写操作时会被阻塞,直到数据就绪。

示例:BIO 服务器

importjava.net.*;importjava.io.*;publicclassBioServer{publicstaticvoidmain(String[]args)throwsIOException{ServerSocketserverSocket=newServerSocket(8080);System.out.println("BIO Server started on port 8080");while(true){SocketclientSocket=serverSocket.accept();// 阻塞等待客户端连接newThread(()->{try{BufferedReaderin=newBufferedReader(newInputStreamReader(clientSocket.getInputStream()));PrintWriterout=newPrintWriter(clientSocket.getOutputStream(),true);Stringrequest;while((request=in.readLine())!=null){// 阻塞读取数据System.out.println("Received: "+request);out.println("Echo: "+request);// 响应客户端}clientSocket.close();}catch(IOExceptione){e.printStackTrace();}}).start();}}}

特点

  • 每个连接一个线程,适合连接数少的场景。
  • 编程简单,但线程开销大,无法应对高并发。

2. NIO (Non-blocking I/O) - 同步非阻塞 I/O

NIO 基于 Channel 和 Selector,使用单个线程管理多个连接,通过事件驱动机制实现非阻塞。

示例:NIO 服务器

importjava.net.*;importjava.nio.*;importjava.nio.channels.*;importjava.util.*;publicclassNioServer{publicstaticvoidmain(String[]args)throwsIOException{ServerSocketChannelserverChannel=ServerSocketChannel.open();serverChannel.bind(newInetSocketAddress(8080));serverChannel.configureBlocking(false);// 非阻塞模式Selectorselector=Selector.open();serverChannel.register(selector,SelectionKey.OP_ACCEPT);// 注册接受连接事件System.out.println("NIO Server started on port 8080");while(true){selector.select();// 阻塞直到有事件发生Set<SelectionKey>keys=selector.selectedKeys();Iterator<SelectionKey>iter=keys.iterator();while(iter.hasNext()){SelectionKeykey=iter.next();iter.remove();if(key.isAcceptable()){ServerSocketChannelserver=(ServerSocketChannel)key.channel();SocketChannelclient=server.accept();client.configureBlocking(false);client.register(selector,SelectionKey.OP_READ);// 注册读事件System.out.println("Client connected: "+client.getRemoteAddress());}elseif(key.isReadable()){SocketChannelclient=(SocketChannel)key.channel();ByteBufferbuffer=ByteBuffer.allocate(1024);intread=client.read(buffer);// 非阻塞读取if(read>0){buffer.flip();byte[]data=newbyte[buffer.remaining()];buffer.get(data);Stringrequest=newString(data);System.out.println("Received: "+request);// 响应客户端ByteBufferresponse=ByteBuffer.wrap(("Echo: "+request).getBytes());client.write(response);}elseif(read==-1){client.close();}}}}}}

特点

  • 单线程处理多连接,减少线程开销。
  • 复杂度较高,需要处理事件循环和缓冲区。

3. AIO (Asynchronous I/O) - 异步非阻塞 I/O

AIO 基于回调机制,应用程序发起 I/O 操作后立即返回,当操作完成时系统会通知应用程序。

示例:AIO 服务器

importjava.net.*;importjava.nio.*;importjava.nio.channels.*;importjava.util.concurrent.*;publicclassAioServer{publicstaticvoidmain(String[]args)throwsIOException{AsynchronousServerSocketChannelserver=AsynchronousServerSocketChannel.open();server.bind(newInetSocketAddress(8080));System.out.println("AIO Server started on port 8080");// 接受连接的回调server.accept(null,newCompletionHandler<AsynchronousSocketChannel,Void>(){@Overridepublicvoidcompleted(AsynchronousSocketChannelclient,Voidattachment){server.accept(null,this);// 继续接受下一个连接ByteBufferbuffer=ByteBuffer.allocate(1024);// 读取数据的回调client.read(buffer,buffer,newCompletionHandler<Integer,ByteBuffer>(){@Overridepublicvoidcompleted(IntegerbytesRead,ByteBufferbuffer){if(bytesRead>0){buffer.flip();byte[]data=newbyte[buffer.remaining()];buffer.get(data);Stringrequest=newString(data);System.out.println("Received: "+request);// 响应客户端ByteBufferresponse=ByteBuffer.wrap(("Echo: "+request).getBytes());client.write(response,null,newCompletionHandler<Integer,Void>(){@Overridepublicvoidcompleted(Integerresult,Voidattachment){try{client.close();}catch(IOExceptione){e.printStackTrace();}}@Overridepublicvoidfailed(Throwableexc,Voidattachment){exc.printStackTrace();}});}}@Overridepublicvoidfailed(Throwableexc,ByteBufferattachment){exc.printStackTrace();}});}@Overridepublicvoidfailed(Throwableexc,Voidattachment){exc.printStackTrace();}});// 保持服务器运行Thread.currentThread().join();}}

特点

  • 完全异步,基于回调或 Future,性能高。
  • 编程模型复杂,适合连接数多且长连接的场景。

对比分析

特性BIONIOAIO
模型同步阻塞同步非阻塞(多路复用)异步非阻塞
线程数一个连接一个线程一个线程处理多个连接少量线程,回调驱动
吞吐量低(线程上下文切换开销大)中高
编程复杂度简单复杂(需处理 Selector 等)非常复杂(回调地狱)
适用场景连接数少、固定架构连接数多、短连接(如聊天)连接数多、长连接(如文件传输)
JDK 版本Java 1.0+Java 1.4+Java 1.7+

总结

  • BIO:简单但性能差,适合低并发场景。
  • NIO:性能较好,复杂度高,适合高并发短连接(Netty 基于 NIO)。
  • AIO:性能最佳,但编程复杂,在 Linux 上优势不明显(Linux 对 AIO 支持有限,常用 NIO)。

实际项目中,NIO 框架(如 Netty)使用最广泛,平衡了性能和复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1119512.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java垃圾收集 minorgc majargc fullgc

核心概念总览 这三种 GC 类型的本质区别在于回收的堆内存区域和触发原因。GC 类型别名回收区域触发原因特点Minor GCYoung GC只回收年轻代 (Eden Survivor)Eden 区空间不足非常频繁&#xff0c;速度通常很快&#xff0c;使用复制算法Major GCOld GC只回收老年代老年代空间不足…

基于RK3399Pro与RK3568的车载防撞方案:为货车泥头车安全护航

rk3399pro&#xff0c;rk3568&#xff0c;车载方案设计&#xff0c;4路AHD-1080P摄像头输入&#xff0c;防撞识别&#xff0c;助力货车泥头车安全运输&#xff01;在货运行业中&#xff0c;货车与泥头车的安全运输至关重要。今天咱就聊聊基于RK3399Pro和RK3568芯片的车载方案设…

超详细逻辑回归解说

逻辑回归是用来做“分类”的模型&#xff08;比如判断“是不是垃圾邮件”“病人有没有患病”“用户会不会点击广告”&#xff09;&#xff0c;而非回归。它的核心是&#xff1a;用“概率”的方式&#xff0c;把线性回归的输出&#xff08;连续值&#xff09;转化为“是/否”的分…

超声波传感器(HC-SR04)与Arduino Uno及Mixly使用

【结合AI智能体学习记录】一、&#xff08;HC-SR04&#xff09;超声波传感器工作原理&#xff1a;超声波传感器和蝙蝠的定位原理一致&#xff0c;核心是通过计算超声波往返时间来换算距离&#xff1a;1. 触发发射&#xff1a;模块的Trig引脚接收到高电平信号后&#xff0c;会自…

学霸同款2026TOP10AI论文网站:本科生毕业论文神器测评

学霸同款2026TOP10AI论文网站&#xff1a;本科生毕业论文神器测评 2026年学术写作工具测评&#xff1a;为何需要这份榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;AI论文网站逐渐成为高校学生和研究人员的重要辅助工具。然而&#xff0c;面对市场上琳琅满目的选择&…

react组件内添加一个全局点击时间,点击函数能区分是否是某个特定的id的dom触发的

在 React 组件内添加一个全局点击事件&#xff0c;并判断是否是某个特定 id 的 DOM 触发&#xff0c;可以这样实现&#xff1a; 实现思路 在组件 mount 时&#xff08;useEffect&#xff09;&#xff0c;用 document.addEventListener 注册全局点击事件。回调函数中通过 event.…

.NET 某RFID标签打印客户端 崩溃分析

崩溃分析1. 为什么会崩溃双击打开dump&#xff0c;windbg会自动定位到崩溃的上下文&#xff0c;这一点我比较喜欢&#xff0c;有的时候也省去了用 !analyze -v 无趣的等待&#xff0c;参考输出如下&#xff1a;This dump file has an exception of interest stored in it. The …

游戏打不开、程序闪退怎么办?有效的DLL修复工具推荐,一键拯救你的电脑

“由于找不到MSVCP140.dll&#xff0c;无法继续执行代码。”“应用程序无法正常启动(0xc000007b)。”相信许多电脑用户都遇到过类似的弹窗警告&#xff0c;尤其是在运行新安装的游戏或专业软件时。这些令人头疼的问题&#xff0c;十有八九都指向同一个“元凶”——C运行库的缺失…

风光柴储多目标联合调度问题探索

风光柴储多目标联合调度问题 联合调度分析各部分消纳比例&#xff0c;目标各部分成本最小和排放最小。 约束各部荷电状态&#xff0c;功率平衡等等在当今能源转型的大背景下&#xff0c;风光柴储多目标联合调度成为了热门话题。这种联合调度旨在实现能源的高效利用&#xff0c;…

实体门店新纪元:从“单点AI尝试”到“系统智能体”的转型之路

近两年来&#xff0c;实体经营领域普遍感受到一种“矛盾现象”&#xff1a;技术在不断升级&#xff0c;设备在持续更新&#xff0c;AI话题也频繁出现在各类讨论中&#xff0c;然而&#xff0c;许多门店的经营压力并未因此减轻&#xff0c;反而呈现出更加复杂的挑战。客流获取成…

Oracle 高风险锁等待快速诊断手册

一、手册使用说明1.1 适用场景生产库出现会话阻塞、业务卡顿、事务超时监控工具&#xff08;如OEM、Zabbix&#xff09;告警“锁等待次数突增”“Concurrency等待占比超20%”出现高风险锁事件&#xff08;如enq: CI - contention、enq: TX - allocate ITL entry&#xff09;1.2…

从“经验驱动”到“系统智能”:实体门店经营的结构性升级

当前实体经营领域&#xff0c;普遍存在一个深层挑战&#xff1a;许多门店尽管在工具、设备乃至营销手段上不断更新&#xff0c;但其核心经营逻辑仍停留在较为传统的模式。获客依赖广告与促销&#xff0c;服务依靠人员经验与话术&#xff0c;客户离店后关系难以持续&#xff0c;…

UVM-phase中的object机制

在class uvm_phase extends uvm_object中1. 类的作用和结构这个类是 uvm_phase&#xff0c;它管理测试平台中阶段的 objection 机制。UVM 使用 objection 机制来控制仿真的执行时间&#xff0c;防止测试提前结束。核心成员&#xff1a;systemveriloguvm_objection phase_done; …

AI+IoT双轮驱动:构建风电设备预测性维护数字孪生体的全栈技术实践

凌晨三点&#xff0c;内蒙古某大型风电场运维主管王工接到SCADA系统告警&#xff1a;“#23风机异常停机”。他迅速调取振动频谱图&#xff0c;却发现数据杂乱无章——是主轴承即将失效&#xff1f;还是传感器松动导致误报&#xff1f;抑或只是电网波动引发的瞬时保护动作&#…

UE5 C++(7):

&#xff08;31&#xff09; &#xff08;32&#xff09; 谢谢

企业落地 ChatBI,如何构建可信可靠的数据底座?

在企业 ChatBI 落地过程中&#xff0c;数据底座的技术路线选择直接决定了数据可信度、维护成本和业务响应速度。传统宽表架构在数据口径一致性、维护成本和灵活性上已难以支撑企业级 ChatBI 的规模化应用&#xff0c;而基于 NoETL 明细语义层的方案正成为新一代数据底座的主流选…

亲测好用8个AI论文写作软件,本科生搞定论文不求人!

亲测好用8个AI论文写作软件&#xff0c;本科生搞定论文不求人&#xff01; AI 工具如何让论文写作变得轻松高效 在当今这个信息爆炸的时代&#xff0c;本科生的论文写作任务日益繁重&#xff0c;尤其是在面对大量文献阅读、数据分析和文字表达时&#xff0c;许多同学都会感到力…

UE5 C++(6-2):描述角色 EndPlay 原因的枚举类 EEndPlayReason::Type,此命名空间里定义了一个枚举类。

&#xff08;30&#xff09;描述角色 EndPlay 原因的枚举类 EEndPlayReason::Type &#xff1a;&#xff08;31&#xff09; 谢谢

基于IEEE33节点配电网的分布式电源与电动汽车接入潮流计算研究:考虑风光时序特性与电动汽车出...

含分布式电源和电动汽车的配电网潮流计算 考虑风光以及电动汽车的出力时序特性 建立风光电动汽车接入的潮流模型 基于IEEE33节点配电网&#xff0c;采用牛拉法求解得到接入之后的潮流分布。引言 随着可再生能源与新型用电负荷的快速发展&#xff0c;现代配电网正经历从“被动”…