面试准备-6

embedded/2024/10/21 7:47:52/

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.ppmy.cn/embedded/108848.html

相关文章

HomeAssistant添加HACS绑定米家与苹果HomeKit设备并实现远程管理

文章目录 前言1. 下载HACS源码2. 添加HACS商店3. 绑定米家设备 前言 之前介绍过如何实现在群晖NAS使用Docker部署HomeAssistant,通过内网穿透在户外控制家庭智能设备。本文将介绍如何在HA平台安装HACS插件商店,将米家,果家设备接入 Home Ass…

在JS中flat() 和 flatMap()使用讲解

flat() 和 flatMap() 是 JavaScript 中处理数组的两个方法,用于处理嵌套数组,但它们有不同的用途和效果。以下是它们的详细区别: 1. Array.prototype.flat() 功能:将嵌套的数组“拉平”成一维数组。 语法: array.fla…

[NISACTF 2022]easyssrf

打开题目所在的环境,发现是快照获取的工具,这里我尝试输入的是百度的网址,发现他会返回这个网站的一些基本信息 : 这个题目提示了ssrf,我们这里用file协议开始测试: file:///etc/password 发现返回的结果是…

自动驾驶ADAS算法--使用MATLBA和UE4生成测试视频

原文参考:金书世界 环境搭建参考:用MATLAB2020b和虚拟引擎(Unreal Engine)联合仿真输出AVM全景测试视频----Matlab环境搭建 matlab参考: https://ww2.mathworks.cn/help/driving/ug/simulate-a-simple-driving-sce…

Android之SharedPreferences(SP)

目录 概念使用1.获取 SharedPreferences 实例1.1 通过 Context 获取默认的 SharedPreferences 文件1.2 通过 Activity 获取默认的 SharedPreferences 文件1.3 通过 PreferenceManager 获取默认的 SharedPreferences 文件 2.存储数据3.读取数据4.删除数据5.监听数据变化 使用场景…

来聊聊C++中的vector

一.vector简介 vector是什么 C 中的 vector 是一种序列容器,它允许你在运行时动态地插入和删除元素。 vector 是基于数组的数据结构,但它可以自动管理内存,这意味着你不需要手动分配和释放内存。 与 C 数组相比,vector 具有更多的…

吐血整理 ChatGPT 3.5/4.0 新手使用手册~ 【2024.09.03 更新】

以前我也是通过官网使用,但是经常被封号,就非常不方便,后来有朋友推荐国内工具,用了一阵之后,发现:稳定方便,用着也挺好的。 最新的 GPT-4o、4o mini,可搭配使用~ 1、 最新模型科普&…

清洁眼镜片

经常眼镜弄脏了 怎么弄都干净不了 根本无法佩戴 影响出门时间 有时在外很尴尬 其实清洁很简单 从水龙水冲洗镜片(可附上洗手液) 然后用纸巾局部点触抹干偶尔泛起小水滴 就好