Java NIO中的Selector详解

news/2024/8/27 21:39:53 标签: java, nio
❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」,wx号 : 「liwu0213」
☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
♝博主的话 : 搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基

1. Java NIO与Selector的基本概念

Java NIO(New IO)是Java提供的一套用于非阻塞I/O操作的API,它允许应用程序使用非阻塞I/O模型进行网络通信。Selector是Java NIO中的一个核心组件,用于同时监听多个通道的IO(输入/输出)状态变化,包括可读、可写等状态。使用Selector可以极大地提高应用程序的并发处理能力和效率。

2. Selector在Java NIO中的作用及其重要性

Selector允许一个线程同时管理多个通道,减少了线程的使用和上下文切换的开销。通过使用Selector,一个单独的线程可以处理多个网络连接,提高了系统的并发处理能力和稳定性。在处理大量并发连接时,使用Selector可以有效地减少线程数量和资源消耗,提高系统的整体性能。

3. Selector的工作原理和内部机制

3.1 Selector的创建

通过调用Selector.open()方法创建一个Selector对象。

3.2 通道注册

将通道注册到Selector上,并指定要监听的事件类型(如SelectionKey.OP_READSelectionKey.OP_WRITE等)。

3.3 查询就绪状态

调用selector.select()方法查询已经就绪的通道操作,这些就绪的状态集合,保存在一个元素是SelectionKey对象的Set集合中。

3.4 处理就绪事件

遍历SelectionKey集合,根据就绪状态执行相应的操作。

4. 使用Selector的示例代码及解释

java">Selector selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false); // 设置为非阻塞模式
serverChannel.bind(new InetSocketAddress(8080));
serverChannel.register(selector, SelectionKey.OP_ACCEPT);

while (true) {
    int readyChannels = selector.select();
    if (readyChannels == 0) continue;
    Set<SelectionKey> selectedKeys = selector.selectedKeys();
    Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
    while (keyIterator.hasNext()) {
        SelectionKey key = keyIterator.next();
        if (key.isAcceptable()) {
            // a connection was accepted by a ServerSocketChannel
            // 获取对应的ServerSocketChannel
            ServerSocketChannel server = (ServerSocketChannel) key.channel();
            // 接受客户端连接
            SocketChannel client = server.accept();
            // 将新连接的客户端设置为非阻塞
            client.configureBlocking(false);
            // 注册新连接的客户端为可读
            client.register(selector, SelectionKey.OP_READ);
        }
        keyIterator.remove();
    }
}

在上述代码中,服务器监听端口8080,当有客户端连接时,服务器接受连接并将新连接的客户端设置为非阻塞模式,然后注册新连接的客户端为可读,等待客户端发送数据。

5. Selector的性能优势和使用场景

Selector通过非阻塞I/O模型实现高性能的网络服务器,适用于处理大量并发连接的场景。使用Selector可以显著减少服务器的线程数量,提高系统的并发处理能力。在实际应用中,Selector常常用于实现高性能、高并发的网络服务器,例如Redis单线程模式设计就是一个典型的例子。

总结

Selector是Java NIO中能够检测多个注册的通道是否处于就绪状态的核心组件,通过Selector可以实现单线程处理多个Channel,从而减少线程上下文切换的开销,提高系统的效率和稳定性。在实际应用中,可以通过将多个通道注册到同一个Selector上来实现高性能、高并发的网络服务器。


关注公众号[码到三十五]获取更多技术干货 !


http://www.niftyadmin.cn/n/5559181.html

相关文章

c语言唯一一个三目运算符

条件表达式由两个符号&#xff08;&#xff1f;和&#xff1a;&#xff09;组成&#xff0c;必须一起使用。要求有三个操作对象&#xff0c;称为三目运算符。 一般形式为 表达式1&#xff1f;表达式2&#xff1a;表达式3 理解如下&#xff1a; a>b?(maxa):(maxb); //相当…

Rust编程-crates.io

发布配置和开发配置&#xff1a; [profile.dev]: > cargo build opt-level0 [profile.release]: > cargo build --release opt-level3 发布到crates.io 文档注释&#xff1a; 三斜线&#xff08;///&#xff09;&#xff0c;使用markdown语法来格式化内容 可以为函数…

springboot+vue+mybatis鲜花管理系统+PPT+论文+讲解+售后

随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;鲜花管理系统当然也不能排除在外。鲜花管理系统是以实际运用为开发背景&#xff0c;运用软件工程开发方法&#xff0c;采用SSM技…

Windows与Ubuntu安装ffmpeg

文章目录 前言ffmpeg的简介安装ffmpegWindows下载设置环境变量 Ubuntu 总结 前言 FFmpeg是一款非常强大的开源音视频处理工具&#xff0c;它包含了众多的音视频编解码库&#xff0c;可以用于音视频的采集、编解码、转码、流化、过滤和播放等复杂的处理。在Windows系统上安装FF…

集群服务器如何解决跨服务器通信?大量并发通信问题?

Nginx tcp负载均衡模块&#xff1a; 1.将client的请求按照 负载均衡算法 分发到服务器 2.负载均衡器与服务器保持心跳机制&#xff0c;监测故障、保障服务可靠性 3.可以发现添加新的服务器&#xff0c;方便扩展服务器集群的数量 Nginx反向代理用途&#xff1a; 2.4 用途 …

内存泄漏和内存溢出

内存溢出与内存泄露 内存溢出&#xff08;Out of Memory&#xff0c;俗称 OOM&#xff09;和内存泄漏&#xff08;Memory Leak&#xff09;是两个不同的概念&#xff0c;但它们都与内存管理有关。 内存溢出是指是指当程序请求分配内存时&#xff0c;由于没有足够的内存空间满…

081、Python 关于方法重写

所谓方法重写&#xff0c;就是子类对父类已有的方法&#xff0c;重新编写自己的实现版本&#xff0c;这个过程就叫做方法重写&#xff08;override&#xff09;。 说到方法重写&#xff0c;就不得不提多态。因为方法重写是实现多态的一种重要方式。 所谓多态&#xff0c;就是…

Centos7 rpm 安装 Mysql 8.0.28

Centos7 rpm 安装 Mysql 8.0.28 一、检查系统是否已经安装了Mysql 如果安装了则卸载 [rootiZbp1byzaznzn9jncxr010Z /]# rpm -qa | grep mysql[rootiZbp1byzaznzn9jncxr010Z /]# rpm -qa | grep mariadb mariadb-libs-5.5.68-1.el7.x86_64如果安装了 mysql &#xff0c;maria…