当前位置: 首页 > 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.lryc.cn/news/433244.html

相关文章:

  • context canceled 到底谁在作祟?
  • windows C++ 虚拟内存的按需调拨
  • [杂项]pugi::xml获取xml中的注释节点
  • Spring Boot Admin集成与自定义监控告警
  • 如何恢复回收站中已删除/清空的文件
  • 玩短视频素材都是在哪里找的?推荐几个热门的短视频素材下载渠道
  • ThinkPHP5 5.0.23-rce远程代码执行漏洞复现
  • windows下安装并使用nvm
  • mac m2 安装 nvm
  • 通信工程学习:什么是AN接入网络
  • MSCKF7讲:特征管理与优化
  • C# XML 使用教程
  • 淘宝开放平台交易类API解析以及如何测试?
  • 基于聚类与LSTM对比特币价格深度分析与预测
  • YOLOv9改进策略【Neck】| 使用CARAFE轻量级通用上采样算子
  • SpringMVC上
  • 嵌入式软件--51单片机 DAY 2
  • 高精度加法,减法,乘法,除法
  • 学习计划(大三上)
  • 【第0006页 · 数组】寻找重复数
  • 移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——10.继承
  • uniapp+vue3实现双通道透明MP4播放支持小程序和h5
  • 汇编:嵌入式软件架构学习资源
  • python编程知识(实现数据加密和解密)
  • 如何使div居中?CSS居中终极指南
  • Redis 篇-深入了解分布式锁 Redisson 原理(可重入原理、可重试原理、主从一致性原理、解决超时锁失效)
  • PostgreSQL中的多版本并发控制(MVCC)深入解析
  • SpringBoot项目-实现简单的CRUD功能和分页查询
  • CCF编程能力等级认证GESP—C++2级—20240907
  • C语言手撕实战代码_二叉排序树(二叉搜索树)_构建_删除_插入操作详解