当前位置:网站首页>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 - 数据可写出时触发,有因为发送能力弱,数据暂不能写出的情况
边栏推荐
- POE交换机全方位解读(中)
- 天翼云4.0分布式云赋能千行百业数字化转型
- Win11主题下载一直转圈怎么办?Win11主题下载一直转圈的解决方法
- Mini Program Graduation Works WeChat Gymnasium Reservation Mini Program Graduation Design Finished Product (8) Graduation Design Thesis Template
- Security First: Tools You Need to Know to Implement DevSecOps Best Practices
- 数据治理:数据集成和应用模式的演进
- 一文看懂推荐系统:概要01:推荐系统的基本概念
- CWE4.8:2022年危害最大的25种软件安全问题
- 灵动微电子发布低功耗 MM32L0130 系列 MCU 产品
- 2022最新版SSM源码分析:一套教程助你深入理解底层原理,提高核心竞争力!
猜你喜欢
Smart Microelectronics Releases Low-Power MM32L0130 Series MCU Products
Mini Program Graduation Works WeChat Gymnasium Reservation Mini Program Graduation Design Finished Product (8) Graduation Design Thesis Template
技术人生 | 如何设定业务目标
Data Governance: The Evolution of Data Integration and Application Patterns
发挥云网融合优势,天翼云为政企铺设数字化转型跑道
详细教学——1688关键词搜索API操作流程
魔豹联盟:佛萨奇2.0dapp系统开发模式详情
搭建属于自己的知识库(Wikijs)
NeRF: The Secret of 3D Reconstruction Technology in the Popular Scientific Research Circle
Redis总结_实战篇
随机推荐
攻防世界-favorite_number
织梦自定义表单添加全选和全不选功能按钮
判断文件属主
新特性解读 | MySQL 8.0 GIPK 不可见主键
C#里如何简单的校验时间格式
How a "cloud" can bring about new changes in the industry
Several common cross-domain solutions
Endanger the safety of common Internet attacks have?
衡量软件产品质量的 14 个指标
golang刷leetcode 经典(4) 实现跳表
2021年下半年软件设计师上午真题
IDEA相关配置(特别完整)看完此篇就将所有的IDEA的相关配置都配置好了、设置鼠标滚轮修改字体大小、设置鼠标悬浮提示、设置主题、设置窗体及菜单的字体及字体大小、设置编辑区主题、通过插件更换主题
MySQL基本查询和运算符
Flink学习9:配置idea开发flink-Scala程序环境
MySQL命令(命令行方式,而非图形界面方式)
Cpolar application example of data acquisition equipment
Navicat 连接Oracle时提示oracle library is not loaded的问题解决
Flink Learning 9: Configure the idea to develop the flink-Scala program environment
全面认识二极管,一篇文章就够了
CWE4.8:2022年危害最大的25种软件安全问题