文章目录

  • Selector 介绍
  • Selector 的使用方法

Selector 介绍

  • Selector 一般称为选择器, 也可以翻译为多路复用器
  • 它是 Java NIO 核心组件中的一个, 用于检查一个或多个 NIO Channel(通道)的状态是否处于可读、可写
  • 可以实现单线程管理多个 channels, 相比使用多个线程, 避免了线程上下文切换带来的开销

Selector 的使用方法

  1. 通过调用 Selector.open() 方法创建一个 Selector 对象,如下
Selector selector = Selector.open();
  1. 注册 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
  1. 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;
  1. 从 Selector 中选择 Channel
  • Selector 维护注册过的 Channel 集合, 并且这种注册关系被封装在 SelectionKey 中
  • 通过 Selector 的 select() 方法可以选择已经准备就绪的 Channel
    • int select():阻塞到至少有一个通道在你注册的事件上就绪了
    • int select(long timeout):和 select() 一样,但最长阻塞时间为timeout毫秒
    • int selectNow():非阻塞,只要有通道就绪就立刻返回
  • select() 方法返回的 int 值表示有多少通道已经就绪,是自上次调用 select() 方法后有多少通道变成就绪状态

Selector 选择器相关推荐

  1. Android美工坊:Selector选择器的使用

    Android selector选择器可以让你切换自定义的背景风格,比如button.ListView.或者布局点击时候的背景切换等,都需要用到它 背景可以是自定义到颜色,或者图片资源 首先需要在你的 ...

  2. Java NIO之Selector(选择器)

    **Java高级特性增强-NIO 本部分网络上有大量的资源可以参考,在这里做了部分整理并做了部分勘误,感谢前辈的付出,每节文章末尾有引用列表~ 写在所有文字的前面:作者在此特别推荐Google排名第一 ...

  3. Selector选择器概述||Selector选择器组合使用

    Selector选择器组合使用

  4. 使用选择器语法查找元素——​​​​​​​Selector选择器概述 ——未完待续

    使用选择器语法查找元素 jsoup elements对象支持类似于CSS (或jquery)的选择器语法,来实现非常强大和灵活的查找功能. select 方法在Document, Element,或E ...

  5. [JavaWeb-XML]XML_快捷查询方式(selector选择器,XPath)

    快捷查询方式: 1. selector:选择器* 使用的方法:Elements select​(String cssQuery)* 语法:参考Selector类中定义的语法2. XPath:XPath ...

  6. (五)Netty之Selector选择器

    基本介绍 Java的NIO,用非阻塞的IO方式,可以用一个线程,处理多个客户端连接,就会使用到Selector(选择器) Selector能够检测多个注册通道上是否有事件发生(注意:多个Channel ...

  7. selector选择器查询

    * 快捷的查询方式:1. selector:选择器* 使用的方法:Elements select(String cssQuery)* 语法:参考Selector类中定义的语法* 地址:jsoup-1. ...

  8. JAVA NIO:NIO与OIO的对比以及Channel通道、Selector选择器、Buffer缓冲区的介绍 高并发

    文章目录 二 Java NIO (一)NIO对比OIO (二)概述三个核心组件 Channel通道 Selector选择器 Buffer缓冲区 (三)Buffer详解 1 Buffer类 2 四个属性 ...

  9. JAVA NIO:NIO与OIO的对比以及Channel通道、Selector选择器、Buffer缓冲区的介绍 //高并发

    文章目录 二 Java NIO (一)NIO对比OIO (二)概述三个核心组件 Channel通道 Selector选择器 Buffer缓冲区 (三)Buffer详解 1 Buffer类 2 四个属性 ...

  10. [Netty] Selector选择器以及Reactor实现 (七)

    文章目录 1.Nio中的Selector介绍 1.1 Selector 1.2 SelectionKey 1.3 ServerSocketChannel 1.4 SocketChannel 2.Net ...

最新文章

  1. 建模大师怎么安装到revit中_「Revit技巧」插件挤满了、冲突了,怎么办?
  2. linux命令之创建符号连接-ln
  3. 确定组织是否真正敏捷的五种方法
  4. 直播 | DSTC 8“基于Schema的对话状态追踪”竞赛冠军方案解读
  5. rop的noejs客户端
  6. CentOS6.3的Grub启动项的menu.lst文件内容
  7. 1910101811-2
  8. [Windows Server 2008] 404错误设置方法
  9. [转载] Python 内置函数 dir()
  10. Python collections 模块中的 deque(队列)
  11. 【路径规划】基于matlab遗传算法求解同时取送货车辆路径问题【含Matlab源码 1072期】
  12. 风控建模一、初步认识风控
  13. Flutter持久化存储之使用和封装shared_preferences
  14. html5 打字机效果,逼真的js打字机效果插件
  15. 云计算领域常见的一些专业术语、专有名词总结(一)
  16. ZJOI2019一轮游记
  17. BBS系统的设计与实现
  18. 百度全景地图调用时不能进入
  19. 通过pyhton认识一等函数
  20. so slow of the speed

热门文章

  1. Java/Android中的引用类型及WeakReference应用实践
  2. 王岳华:投区块链里最有前景的项目,做最闪亮的投资人
  3. B站MoshSQL进阶教程【第一章】做好准备
  4. SolidWorks Motion学习笔记1
  5. 【MySQL】数据库的事务使用
  6. Python-turtle绘画旅程第一站:哆啦a梦
  7. Kail Linux如何安装搜狗输入法
  8. 0-1背包问题及Python代码实现
  9. javabean是什么意思中文,干货满满!
  10. Linux脚本命令万能手脚架整理