当前位置:网站首页>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 - 数据可写出时触发,有因为发送能力弱,数据暂不能写出的情况
边栏推荐
- 【软考软件评测师】基于经验的测试技术
- 【案例】2D变换-旋转动画
- pydev debugger: warning: trying to add breakpoint to file that does not exist: /tmp/xxx
- Smart Microelectronics Releases Low-Power MM32L0130 Series MCU Products
- POE交换机全方位解读(下)
- 天翼云4.0分布式云赋能千行百业数字化转型
- MySQL命令(命令行方式,而非图形界面方式)
- NeRF: The Secret of 3D Reconstruction Technology in the Popular Scientific Research Circle
- The days of patching are more difficult than the days of writing code
- POE交换机常见问题解答
猜你喜欢
衡量软件产品质量的 14 个指标
Wechat Gymnasium Appointment Mini Program Graduation Design Finished Works Mini Program Graduation Design Finished Work (6) Question Opening Reply PPT
Code Inspection for DevOps
成功部署工业物联网的五个关键
LeetCode 2333. 最小差值平方和(贪心)
详细教学——1688关键词搜索API操作流程
shell中awk命令的if条件语句引入外置变量
方法的使用
Redis总结_实战篇
如何确保智能工厂的安全?
随机推荐
Gear 月度更新|6 月
Simulink脚本自动创建Autosar Parameter Port及Mapping
注释
Go 语言快速入门指南:第二篇 变量与常量
深入理解IO流(第一篇)
记一次 .NET 某工控自动化控制系统 卡死分析
白话电子签章原理及风险
Open Source Summer | [Cloud Native] DevOps (5): Integrating Harbor
千万级别的表分页查询非常慢,怎么办?
一朵“云“如何带来产业新变革
redis总结_多级缓存
方法的使用
MySQL命令(命令行方式,而非图形界面方式)
54.【system系统互动函数大总结】
Since September, China has granted zero-tariff treatment to 98% of tax items from 16 countries including Togo
大事务故障案例
Remember the stuck analysis of an industrial automation control system in .NET
打补丁的日子,比写代码的日子难熬多了
Openharmony - 基于ArkUI(TS)开发颜色选择器
CWE4.8:2022年危害最大的25种软件安全问题