当前位置: 首页 > news >正文

BIO、NIO、AIO的区别

BIO、NIO、AIO 是 Java 中用于处理 网络通信或 I/O 操作的三种方式。

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

  • 每个请求一个线程,线程阻塞等待数据。
  • 数据未准备好,线程就会一直阻塞,直到有数据可读/写。
  • 简单,但 线程资源开销大,扩展性差
  • 适用于客户端连接数少(如管理系统、工具后台)。
ServerSocket server = new ServerSocket(8080);
Socket client = server.accept(); // 阻塞等待连接
InputStream in = client.getInputStream();
int data = in.read(); // 阻塞等待数据

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

  • 使用 Selector + Channel 实现 单线程处理多连接
  • 线程通过轮询检查是否有就绪事件。
  • 数据未准备好时不会阻塞,而是继续处理其他事件。
  • 适用于高并发服务器,如聊天室、游戏服务器。
Selector selector = Selector.open();
ServerSocketChannel server = ServerSocketChannel.open();
server.configureBlocking(false);
server.register(selector, SelectionKey.OP_ACCEPT);while (true) {selector.select(); // 阻塞等待就绪事件Set<SelectionKey> keys = selector.selectedKeys();// 遍历处理就绪事件
}

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

  • 操作完成后通过回调函数进行通知,完全异步。
  • 不需要轮询,减少 CPU 占用。
  • 使用底层操作系统的异步 I/O 支持(如 Linux 的 epoll + aio)。
  • 适用于高并发并对延迟要求高的系统,如异步文件传输、微服务网关。
AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(8080));
server.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {public void completed(AsynchronousSocketChannel client, Void attachment) {// 处理客户端连接}public void failed(Throwable exc, Void attachment) {// 处理失败}
});

BIO/NIO/AIO 本质上是 I/O 模型,不仅用于网络通信(如 Socket),也适用于 文件读写、磁盘、数据库连接等所有输入/输出操作(I/O)。它们是 Java 对于底层操作系统 I/O 能力的封装方式。我们使用的时候一般会直接使用封装好的通信框架,比如Netty、gRPC等。

每天做一点点,往目标前进一点点,你就会成功。-- 烟沙九洲

http://www.xdnf.cn/news/952939.html

相关文章:

  • EtherCAT主站转Profinet网关接IS620N伺服驱动器与西门子plc通讯案例
  • Qt Http Server模块功能及架构
  • 【Java多线程从青铜到王者】单例设计模式(八)
  • markdown,nodejs前世今生以及内置模块相关知识点
  • AI原生应用实战:用户画像建模的7种机器学习方法
  • 力扣面试150题--蛇梯棋
  • 开发Vue.js组件的二三事
  • if 选择结构
  • 下载https协议的网络图片,并转为Base64
  • 浅谈非理想性因素对星座图的影响
  • ArcGIS Pro制作水平横向图例+多级标注
  • PIN码vs密码,电脑登录的快捷键你用对了吗?
  • CppCon 2015 学习:STL Algorithms in Action
  • Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
  • The Trade Desk推出DealDesk,试图让交易ID不再糟糕
  • HTTP 与 TCP 协议的区别与联系
  • 【C++】unordered_set和unordered_map
  • tauri项目,如何在rust端读取电脑环境变量
  • 画质MxPro:优化手游体验,畅享高清画质
  • Linux初步介绍
  • 【VLNs篇】07:NavRL—在动态环境中学习安全飞行
  • 多轮对话实现
  • react更新页面数据,操作页面,双向数据绑定
  • 免费数学几何作图web平台
  • 在阿里云上搭建n8n
  • React Native 弹窗组件优化实战:解决 Modal 闪烁与动画卡顿问题
  • 【Mini-F5265-OB开发板试用测评】1、串口printf输出
  • C++中auto和auto
  • 芯片设计中的通信“动脉”:I2C与I3C IP深度解析
  • ubuntu清理垃圾