在阻塞模式下,相关方法(如ServerSocketChannel.accept
和SocketChannel.read
)会导致线程暂停。当没有连接建立或没有数据可读时,线程会处于等待状态,尽管此时线程不占用CPU资源,但线程本身处于闲置状态。
使用Java NIO,我们可以将通道(Channel)设置为非阻塞模式。在这种模式下,即使在没有连接建立或没有数据可读时,相关方法也会立即返回,而不是让线程暂停。
Selector(选择器)是Java NIO中的一个核心组件,用于检查一个或多个NIO Channel(通道)的状态是否处于可读、可写或已连接。通过Selector,我们可以实现单线程管理多个channels,即管理多个网络连接。
// 1. 创建Selector
Selector selector = Selector.open();
// 2. 配置ServerSocketChannel为非阻塞模式,并注册到Selector
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.configureBlocking(false);
ssc.bind(new InetSocketAddress(8080));
ssc.register(selector, SelectionKey.OP_ACCEPT);
// 3. 处理事件循环
while (true) {
// 等待事件发生
int readyChannels = selector.select();
if (readyChannels == 0) continue;
// 遍历所有就绪的Channel
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
while (keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
if (key.isAcceptable()) {
// 处理新连接
} else if (key.isReadable()) {
// 读取数据
}
// ... 其他事件处理
// 移除已处理的Key,避免重复处理
keyIterator.remove();
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。