Selector 选择器
文章目录
- Selector 介绍
- Selector 的使用方法
Selector 介绍
- Selector 一般称为选择器, 也可以翻译为多路复用器
- 它是 Java NIO 核心组件中的一个, 用于检查一个或多个 NIO Channel(通道)的状态是否处于可读、可写
- 可以实现单线程管理多个 channels, 相比使用多个线程, 避免了线程上下文切换带来的开销
Selector 的使用方法
- 通过调用 Selector.open() 方法创建一个 Selector 对象,如下
Selector selector = Selector.open();
- 注册 Channel 到 Selector
socketChannel.configureBlocking(false);
final SelectionKey key = socketChannel.register(selector, SelectionKey.OP_READ);
Channel 必须是非阻塞的
- FileChannel 不适用 Selector, 因为 FileChannel 不能切换为非阻塞模式
- 准确来说是因为 FileChannel 没有继承 SelectableChannel 抽象类
- SelectableChannel 抽象类有一个 configureBlocking() 方法, 用于使 Channel 处于阻塞模式或者非阻塞模式
- SelectableChannel 使由 AbstractSelectableChannel 抽象类实现的, SocketChannel, ServerSocketChannel, DatagramChannel 都是直接继承了 AbstractSelectChannel 抽象类
register() 方法的第二个参数, 意思是通过 Selector 监听 Channel 时对什么事件感兴趣
- Connect : 某个 Channel 成功连接到另一个服务器称为"连接就绪", SelectionKey.OP_CONNECT
- Accept : 一个 ServerSocketChannel 准备好接受新进入的连接称为"接受就绪", SelectionKey.OP_ACCEPT
- Read : 一个有数据可读的 Channel 称为"读就绪", SelectionKey.OP_READ
- Write : 等待写数据的 Channel 称为"写就绪", SelectionKey.OP_WRITE
- SelectionKey 介绍
一个 SelectionKey 键表示了一个特定的 Channel 对象和一个特定的 Selector 对象之间的注册关系
key.channel(); // 返回该SelectionKey对应的channel。
key.selector(); // 返回该SelectionKey对应的Selector。
key.interestOps(); //返回代表需要Selector监控的IO操作的bit mask
可以通过以下方法来判断Selector是否对Channel的某种事件感兴趣
int interestSet = selectionKey.interestOps();
boolean isInterestedInAccept = (interestSet & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT;
boolean isInterestedInConnect = interestSet & SelectionKey.OP_CONNECT;
boolean isInterestedInRead = interestSet & SelectionKey.OP_READ;
boolean isInterestedInWrite = interestSet & SelectionKey.OP_WRITE;
- 从 Selector 中选择 Channel
- Selector 维护注册过的 Channel 集合, 并且这种注册关系被封装在 SelectionKey 中
- 通过 Selector 的 select() 方法可以选择已经准备就绪的 Channel
- int select():阻塞到至少有一个通道在你注册的事件上就绪了
- int select(long timeout):和 select() 一样,但最长阻塞时间为timeout毫秒
- int selectNow():非阻塞,只要有通道就绪就立刻返回
- select() 方法返回的 int 值表示有多少通道已经就绪,是自上次调用 select() 方法后有多少通道变成就绪状态
Selector 选择器相关推荐
- Android美工坊:Selector选择器的使用
Android selector选择器可以让你切换自定义的背景风格,比如button.ListView.或者布局点击时候的背景切换等,都需要用到它 背景可以是自定义到颜色,或者图片资源 首先需要在你的 ...
- Java NIO之Selector(选择器)
**Java高级特性增强-NIO 本部分网络上有大量的资源可以参考,在这里做了部分整理并做了部分勘误,感谢前辈的付出,每节文章末尾有引用列表~ 写在所有文字的前面:作者在此特别推荐Google排名第一 ...
- Selector选择器概述||Selector选择器组合使用
Selector选择器组合使用
- 使用选择器语法查找元素——Selector选择器概述 ——未完待续
使用选择器语法查找元素 jsoup elements对象支持类似于CSS (或jquery)的选择器语法,来实现非常强大和灵活的查找功能. select 方法在Document, Element,或E ...
- [JavaWeb-XML]XML_快捷查询方式(selector选择器,XPath)
快捷查询方式: 1. selector:选择器* 使用的方法:Elements select(String cssQuery)* 语法:参考Selector类中定义的语法2. XPath:XPath ...
- (五)Netty之Selector选择器
基本介绍 Java的NIO,用非阻塞的IO方式,可以用一个线程,处理多个客户端连接,就会使用到Selector(选择器) Selector能够检测多个注册通道上是否有事件发生(注意:多个Channel ...
- selector选择器查询
* 快捷的查询方式:1. selector:选择器* 使用的方法:Elements select(String cssQuery)* 语法:参考Selector类中定义的语法* 地址:jsoup-1. ...
- JAVA NIO:NIO与OIO的对比以及Channel通道、Selector选择器、Buffer缓冲区的介绍 高并发
文章目录 二 Java NIO (一)NIO对比OIO (二)概述三个核心组件 Channel通道 Selector选择器 Buffer缓冲区 (三)Buffer详解 1 Buffer类 2 四个属性 ...
- JAVA NIO:NIO与OIO的对比以及Channel通道、Selector选择器、Buffer缓冲区的介绍 //高并发
文章目录 二 Java NIO (一)NIO对比OIO (二)概述三个核心组件 Channel通道 Selector选择器 Buffer缓冲区 (三)Buffer详解 1 Buffer类 2 四个属性 ...
- [Netty] Selector选择器以及Reactor实现 (七)
文章目录 1.Nio中的Selector介绍 1.1 Selector 1.2 SelectionKey 1.3 ServerSocketChannel 1.4 SocketChannel 2.Net ...
最新文章
- 建模大师怎么安装到revit中_「Revit技巧」插件挤满了、冲突了,怎么办?
- linux命令之创建符号连接-ln
- 确定组织是否真正敏捷的五种方法
- 直播 | DSTC 8“基于Schema的对话状态追踪”竞赛冠军方案解读
- rop的noejs客户端
- CentOS6.3的Grub启动项的menu.lst文件内容
- 1910101811-2
- [Windows Server 2008] 404错误设置方法
- [转载] Python 内置函数 dir()
- Python collections 模块中的 deque(队列)
- 【路径规划】基于matlab遗传算法求解同时取送货车辆路径问题【含Matlab源码 1072期】
- 风控建模一、初步认识风控
- Flutter持久化存储之使用和封装shared_preferences
- html5 打字机效果,逼真的js打字机效果插件
- 云计算领域常见的一些专业术语、专有名词总结(一)
- ZJOI2019一轮游记
- BBS系统的设计与实现
- 百度全景地图调用时不能进入
- 通过pyhton认识一等函数
- so slow of the speed