BIO、NIO、AIO 的区别¶
一、BIO¶
同步阻塞。
ServerSocket ss = new ServerSocket(8080);
while (true) {
Socket s = ss.accept(); // 阻塞
new Thread(() -> read(s)).start();
}
- 一个连接一个线程。
- 连接多线程多。
二、NIO¶
同步非阻塞。
Selector selector = Selector.open();
channel.register(selector, SelectionKey.OP_READ);
while (true) {
selector.select();
// 处理就绪事件
}
- 一个线程处理所有连接。
- IO 多路复用。
- 三大组件:Channel、Buffer、Selector。
三、AIO¶
异步非阻塞。
AsynchronousServerSocketChannel channel = ...;
channel.accept(null, new CompletionHandler<>() {
public void completed(...) {}
});
- 操作系统完成 IO 后通知应用。
- 真正异步。
四、对比¶
| BIO | NIO | AIO | |
|---|---|---|---|
| 模型 | 同步阻塞 | 同步非阻塞 | 异步非阻塞 |
| 线程 | 一连接一线程 | 一个线程多连接 | 操作系统回调 |
| 适用 | 连接少 | 连接多 | 连接多 |
| 代表 | Tomcat BIO | Netty | Windows IOCP |
五、Netty 用 NIO¶
AIO 在 Linux 不成熟,Netty 用 NIO。
一句话
BIO 阻塞,NIO 多路复用,AIO 异步回调。