当前位置: 首页 > 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操作。

相关文章:

  • 【Qt】qt发布Release版本,打包.exe可执行文件
  • 如何打造高校实验室教学管理系统?Java SpringBoot助力,MySQL存储优化,2025届必备设计指南
  • 手写登录页面,unique_ptr智能指针
  • 项目实战 ---- 商用落地视频搜索系统(7)---预处理二次优化
  • 海事行政执法证照片要求及尺寸格式修改方法
  • 虚幻中的c++(持续更新)
  • JVM 垃圾回收机制:GC
  • 计算机毕业设计 | SpringBoot+vue 游戏商城 steam网站管理系统(附源码)
  • 浅谈Unity协程的工作机制
  • 模版的价值工程
  • 内推|京东|后端开发|运维|算法...|北京 更多岗位扫内推码了解,直接投递,跟踪进度
  • CSS学习11--版心和布局流程以及几种分布的例子
  • 【C++二分查找 拆位法】2411. 按位或最大的最小子数组长度
  • Java | Leetcode Java题解之第390题消除游戏
  • Windows自动化应用程序已启动/未启动,有进程无进程情况-拽起应用程序
  • Percona 开源监控方案 PMM 详解
  • 爆改YOLOv8|利用图像分割网络UNetV2改进yolov8主干-即插即用
  • Modbus-RTU协议
  • 如何将代理IP设置为ISP:详细指南
  • CSP-J选择题专项训练1 -数据结构树
  • https://app.hackthebox.com/machines/Inject
  • Spring —— Spring简单的读取和存储对象 Ⅱ
  • 渗透测试之冰蝎实战
  • Mybatis、TKMybatis对比
  • Microsoft Office 2019(2022年10月批量许可版)图文教程
  • 《谷粒商城基础篇》分布式基础环境搭建
  • 哈希表题目:砖墙
  • Vue 3.0 选项 生命周期钩子
  • 【车载嵌入式开发】AutoSar架构入门介绍篇
  • 【计算机视觉 | 目标检测】DETR风格的目标检测框架解读