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等。
每天做一点点,往目标前进一点点,你就会成功。-- 烟沙九洲