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

面试准备-6

NIO底层是用Selector、Channel和ByteBuffer来实现的。主线程在循环使用select方法进行阻塞等待,当有acceptable(可连接)、readable(可读)或者writable(可写)事件发生的时候,循环就会往下走,将对应的事件交给对应的事件处理器进行处理。

他可以多线程的,可以有多个accept()线程和多个worker线程。

解释

  • Channel(通道):是Java NIO中的一个核心概念,用于数据的读写操作。它是双向的,但具体使用时可能只关注读或写操作。常见的Channel有SocketChannel(用于TCP连接)、ServerSocketChannel(用于监听TCP连接)、DatagramChannel(用于UDP连接)和FileChannel(用于文件操作)等。

  • Selector(选择器):是Java NIO中的一个可以检查一个或多个NIO Channel,并确定哪些Channel已经准备好进行读、写或其他I/O操作的组件。一个Selector可以管理多个Channel,因此,单个线程可以使用Selector来管理多个Channel的I/O事件。

  • SelectionKey(选择键):代表了一个特定的Channel和它的Selector之间的注册关系。SelectionKey包含了Channel的状态信息,如是否可读、可写或连接就绪等。

工作流程

  1. 创建Selector:首先,需要创建一个Selector实例。

  2. 注册Channel到Selector:将Channel注册到Selector上,并指定该Channel感兴趣的事件(如读、写、连接等)。这个注册过程会返回一个SelectionKey,它代表了Channel和Selector之间的注册关系。

  3. 选择已就绪的Channel:通过Selector的select()selectNow()等方法来检查是否有Channel已就绪(即已经准备好进行读、写或其他操作)。如果有,则将这些Channel的SelectionKey放入到已选择键集合中。

  4. 处理已就绪的Channel:遍历已选择键集合,根据每个SelectionKey的状态(如是否可读、可写等)来处理对应的Channel。

  5. 重复步骤3和4:不断重复检查和处理过程,以持续管理多个Channel的I/O操作。


http://www.mrgr.cn/news/22366.html

相关文章:

  • 利用前缀信息解决子数组问题(上)
  • 【计算机网络】TCP协议(下)
  • 《C Primer Plus》第 11 章复习题和编程练习
  • Vue面试题1
  • PostgreSQL核心功能特性与使用领域及场景分析
  • jdk8特性
  • 深度解析:用 Python 爬虫逆向破解 cielo 请求头加密参数 Api-Key
  • PowerShell 脚本自动化 Windows 工作开发流程
  • gitlab+habor+jenkins+k8s 安装流程及配置实现CICD
  • 基于单片机的电子密码锁设计
  • C语言深入理解指针4
  • mybatis-plus使用@EnumValue搭配shardingsphere报错“getObject with type”
  • C++17: 用折叠表达式实现一个IsAllTrue函数
  • 同样数据源走RTMP播放延迟低还是RTSP低?
  • 一文搞定postgreSQL
  • 记一次学习--内网穿透
  • 抖音素材网站有哪些?这几个高质量的抖音无水印素材网站分享
  • pytyon之raise
  • VMware安装Ubuntu虚拟机
  • Adobe Sensei——自动化视频编辑、特效应用和素材增强,通过AI技术快速优化视频内容,自动修复视频质量、自动添加背景音乐或字幕