Java的Selector调用操作系统层的Multiplexing IO(多路复用模型),本身只是个API调用。而多路复用是这个样子的: I/O multiplexing 这里面的 multiplexing 指的其实是在单个线程通过记录跟踪每一个Sock(I/O流)的状态(对应空管塔里面的Fight progress strip槽)来同时管理多个I/O流. 而这段点代码SelectionKey key = channel.register(selector, SelectionKey.OP_READ); register()方法的第二个参数,这是一个”interest集合“,意思是在通过Selector监听Channel时对什么事件感兴趣. 可以监听四种不同类型的事件: Connect Accept Read Write 通道触发了一个事件意思是该事件已经就绪。所以,某个channel成功连接到另一个服务器称为”连接就绪“。一个server socket channel准备好接收新进入的连接称为”接收就绪“。一个有数据可读的通道可以说是”读就绪“。等代写数据的通道可以说是”写就绪“。 只要ServerSocketChannel及SocketChannel向Selector注册了特定的事件,Selector就会监控这些事件是否发生。SelectableChannel的register()方法返回一个SelectionKey对象,该对象是用于跟踪这些被注册事件的句柄。在执行Selector的select()方法时,如果与SelectionKey相关的事件发生了,这个SelectionKey就被加入到selected-keys集合中,程序直接调用selected-keys集合的remove()方法,或者调用它的iterator的remove()方法,都可以从selected-keys集合中删除一个SelectionKey对象。 通过调用某个SelectionKey的cancel()方法,关闭其通道,或者通过关闭其选择器来取消该Key之前,它一直保持有效。取消某个Key之后不会立即从Selector中移除它,相反,会将该Key添加到Selector的已取消key set,以便在下一次进行选择操作的时候移除它。所以简单来说,上面的那个selectionKey就是一种注册事件,而每一种事件对应着这个连接的一种状态,多路复用模型会检查每个连接所对应的状态,如果达到其中的一种状态,就会触发对应的事件处理逻辑。

来源:云原生后端社区

java 注册监听_java注册监听模型相关推荐

  1. java 多个监听_java中监听一个客户端怎么做?监听多个怎么做?

    随着时代的不断进步与发展,人们对于科学技术的使用也越来越普遍化.人们都开始自己学习编程语言以更好的适应时代的发展.今天就来为大家介绍一下,java中监听一个客户端怎么做?监听多个怎么做?一起来看看吧. ...

  2. java 检测u盘_java实现监听u盘示例分享

    package org.load.u; import java.io.file; import java.util.linkedhashmap; import java.util.map; // u盘 ...

  3. java属性监听_Java event事件监听属性值变化 demo

    1.定义一个 ValueChangedEvent ValueChangedEvent用于在设置属性值的时候,触发事件. package org.teamlet; import java.util.Ev ...

  4. java jmenu 监听_Java中用得比较顺手的事件监听

    第一次听说监听是三年前,做一个webGIS的项目,当时对Listener的印象就是个"监视器",监视着界面的一举一动,一有动静就触发对应的响应. 一.概述 通过对界面的某一或某些操 ...

  5. java 监听鼠标点击_java 事件监听 - 鼠标

    java 事件监听 - 鼠标 //事件监听 //鼠标事件监听 //鼠标事件监听有两个实现接口 //1.MouseListener 普通的鼠标操作 //2.MouseMotionListener 鼠标的 ...

  6. oracle监听静态注册,oracle监听器动态注册于静态注册的区别

    1, oracle 10g 用netca方式建立的都默认为动态注册方式 2,如果想改为静态注册的方式则在listener.ora 中加入如下内容即可 SID_LIST_LISTENER = (SID_ ...

  7. oracle 静态监听 端口,侦听动态注册静态注册local_listener参数端口PORT

    之前都是网上看过整理的,今天看到local_listener竟然一点印象都没有,太恐怖,索性再好好整理一下,避免再次忘记. 一.什么是注册 注册就是将数据库作为一个服务注册到监听程序.客户端不需要知道 ...

  8. 安卓传感器全解:注册、注销传感器、监听传感器,距离传感器、方向传感器、陀螺仪、加速计、磁场、气压传感器

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓传感器全解:注册.注销传感器.监听传感器.距离传感器.方向传感器.陀螺仪.加速计.磁场.气压传感器. 注册.注销.监听传感器 1.自定义传感器监听 ...

  9. Java中使用JNA实现全局监听Linux键盘事件

    title: Java中使用JNA实现全局监听Linux键盘事件 date: 2019-05-03 19:08:00 Java中使用JNA实现全局监听Linux键盘事件 用JNA实现的键盘监听,在Wi ...

最新文章

  1. mysql双主使用reset master清除日志要小心
  2. ASP.NET经典How to do文章汇总
  3. 在html中选项卡怎么做,纯css3制作选项卡
  4. java元婴期(30)----java进阶(springmvc(4)---参数绑定(下)springmvc校验异常处理)
  5. 深入浅出RxJava(三:响应式的好处)
  6. 【ZOJ - 3780】Paint the Grid Again(拓扑排序,图论,证明性质)
  7. Emulator Error: Could not load OpenGLES emulati...
  8. html对图片轮播脚本怎么调用,【jquery前端开发】可调整的幻灯片(图片轮播)
  9. 数据库中union和union all的区别
  10. 力扣-62 不同路径
  11. UNIX网络编程卷1 时间获取程序server UDP 协议无关
  12. 从aspx后台页面向浏览器输出js文件
  13. MATLAB下载+安装教程
  14. CatBoost快速入门
  15. 【转帖】UDIMM、RDIMM、SODIMM以及LRDIMM的区别
  16. scratch一级考纲
  17. mysql 存储数据时,报错Cause: java.sql.SQLException: Incorrect string value: '\xF4\x80\xB3\x81\xE8\xAE...'
  18. 基本弹出窗口代码大全
  19. 第三方支付接口开发及开发中遇到的坑爹问题
  20. 微念入局螺蛳粉餐饮供应链,或成下一个颐海、蜀海

热门文章

  1. [Ariticle]番禺绿地和我小时候的故事
  2. JAVA---事件适配器----用内部类,匿名类实现事件处理
  3. 20190228 搭建Hadoop基础环境
  4. Spring Boot官网概述
  5. Python拓展12(使配置文件生效ConfigParser模块)
  6. 文本区域的高度随着内容增加----插件
  7. javascript实现silverlight pivotViewer控件
  8. Open Graphics Library初步_搭建环境_GLUT
  9. delegate 委托方法
  10. StreamingAssets文件夹的读取异常