当前位置:网站首页>NIO基础之三大组件
NIO基础之三大组件
2022-08-02 17:57:00 【i进击的攻城狮】
一、 Channel
channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层。
channel 是有类型的,一个 string 的 channel 只能存放 string 类型数据。
可以通过Buffer作为容器,往Channel中取出数据或者添加数据。如果Channel是一个水缸,那Buffer就是打水的瓢。
常见的 Channel 有
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
二、Buffer
buffer 则用来缓冲读写数据,使用buffer去对读取或者写入channel的数据,buffer就想读写文件时使用的那个数组一样,常见的 buffer 有
- ByteBuffer
- MappedByteBuffer
- DirectByteBuffer
- HeapByteBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
- CharBuffer
三、 Selector
Selector 一般称为选择器, 也可以翻译为多路复用器,它是 Java NIO 核心组件中的一个, 用于检查一个或多个 NIO Channel(通道)的状态是否处于可读、可写
可以实现单线程管理多个 channels, 相比使用多个线程, 避免了线程上下文切换带来的开销。
selector 的作用就是配合一个线程来管理多个 channel,获取这些 channel 上发生的事件,这些 channel 工作在非阻塞模式下,不会让线程吊死在一个 channel 上。适合连接数特别多,但流量低的场景(low traffic)
channel中会出现数据读取,在单线程中,多个channel的读取都是阻塞的,一个channel在等待客户端读取的过程中,会阻塞其他channel,如果使用多线程,对系统性能是一种挑战。
而selector,可以在单线程中也能对多个channel进行管理,通过channel事件监听的方式,调用 selector 的 select() 会阻塞直到 channel 发生了读写就绪事件,这些事件发生,select 方法就会返回这些事件交给 thread 来处理。
Selector 维护注册过的 Channel 集合, 并且这种注册关系被封装在 SelectionKey 中。selector可以自定义选择监听那些事件,可以绑定的事件类型有:
绑定的事件类型可以有
- connect - 客户端连接成功时触发
- accept - 服务器端成功接受连接时触发
- read - 数据可读入时触发,有因为接收能力弱,数据暂不能读入的情况
- write - 数据可写出时触发,有因为发送能力弱,数据暂不能写出的情况
边栏推荐
- AI+医疗:使用神经网络进行医学影像识别分析
- DevOps之代码检查
- “12306”的架构到底有多牛逼?
- Wechat Gymnasium Appointment Mini Program Graduation Design Finished Work (5) Task Book
- 千万级QPS下服务如何才能平滑启动
- MySQL命令(命令行方式,而非图形界面方式)
- 如何构建准实时数仓?
- ffmpeg cannot find libx264 after compilation
- How to build a quasi-real-time data warehouse?
- How to deal with security risks posed by machine identities
猜你喜欢

MySQL索引

千万级QPS下服务如何才能平滑启动

IDEA相关配置(特别完整)看完此篇就将所有的IDEA的相关配置都配置好了、设置鼠标滚轮修改字体大小、设置鼠标悬浮提示、设置主题、设置窗体及菜单的字体及字体大小、设置编辑区主题、通过插件更换主题

全面认识二极管,一篇文章就够了

php弱类型-攻防世界lottery

How can services start smoothly under tens of millions of QPS

mongodb的游标

故障分析 | 一条 SELECT 语句跑崩了 MySQL ,怎么回事?

MySQL命令(命令行方式,而非图形界面方式)

开源一夏 |【云原生】DevOps(五):集成Harbor
随机推荐
Flink学习9:配置idea开发flink-Scala程序环境
vulnhub W34kn3ss: 1
发挥云网融合优势,天翼云为政企铺设数字化转型跑道
Win11dll文件缺失怎么修复?Win11系统dll文件丢失的解决方法
企业云成本管控,你真的做对了吗?
2022安全员-C证考试题库模拟考试平台操作
pydev debugger: warning: trying to add breakpoint to file that does not exist: /tmp/xxx
How a "cloud" can bring about new changes in the industry
开源一夏 | Web开发(七):登录实现及功能测试
Mini Program Graduation Works WeChat Gymnasium Reservation Mini Program Graduation Design Finished Product (8) Graduation Design Thesis Template
解决多版本jar包冲突问题
How Tencent architects explained: The principle of Redis high-performance communication (essential version)
2022高压电工特种作业证考试题库及答案
Code Inspection for DevOps
golang刷leetcode 经典(3) 设计推特
golang刷leetcode滑动窗口(9) 颜色分类
C#里如何简单的校验时间格式
golang刷leetcode动态规划(9)不同路径 II
cache2go-源码阅读
Wechat Gymnasium Appointment Mini Program Graduation Design Finished Works Mini Program Graduation Design Finished Work (6) Question Opening Reply PPT