4.2 Selector

简介: 4.2 Selector

image.png

创建

Selector selector = Selector.open();

绑定 Channel 事件

也称之为注册事件,绑定的事件 selector 才会关心

channel.configureBlocking(false); SelectionKey key = channel.register(selector, 绑定事件);

  • channel 必须工作在非阻塞模式
  • FileChannel 没有非阻塞模式,因此不能配合 selector 一起使用
  • 绑定的事件类型可以有
  • connect - 客户端连接成功时触发
  • accept - 服务器端成功接受连接时触发
  • read - 数据可读入时触发,有因为接收能力弱,数据暂不能读入的情况
  • write - 数据可写出时触发,有因为发送能力弱,数据暂不能写出的情况

监听 Channel 事件

可以通过下面三种方法来监听是否有事件发生,方法的返回值代表有多少 channel 发生了事件

方法1,阻塞直到绑定事件发生 int count = selector.select(); 方法2,阻塞直到绑定事件发生,或是超时(时间单位为 ms) int count = selector.select(long timeout); 方法3,不会阻塞,也就是不管有没有事件,立刻返回,自己根据返回值检查是否有事件


int count = selector.selectNow();

💡 select 何时不阻塞

  • 事件发生时
  • 客户端发起连接请求,会触发 accept 事件
  • 客户端发送数据过来,客户端正常、异常关闭时,都会触发 read 事件,另外如果发送的数据大于 buffer 缓冲区,会触发多次读取事件
  • channel 可写,会触发 write 事件
  • 在 linux 下 nio bug 发生时
  • 调用 selector.wakeup()
  • 调用 selector.close()
  • selector 所在线程 interrup



目录
相关文章
|
Java 测试技术 Maven
非对称密钥PKCS#1和PKCS#8格式互相转换(Java)
之前在 《前后端RSA互相加解密、加签验签、密钥对生成》 中提到过PKCS#1格式和PKCS#8格式密钥的区别以及如何生成密钥。实际有些场景中有可能也会涉及到前后端密钥格式不一致,这篇文章我们会讨论关于PKCS#1和PKCS#8格式密钥的互相转换。
非对称密钥PKCS#1和PKCS#8格式互相转换(Java)
|
存储 XML jenkins
iOS 底层原理38:自动化打包(一)Xcode + Shell脚本
iOS 底层原理38:自动化打包(一)Xcode + Shell脚本
4121 1
iOS 底层原理38:自动化打包(一)Xcode + Shell脚本
|
存储 关系型数据库 数据库
聊多版本并发控制(MVCC)
MVCC是数据库并发控制技术,用于减少读写冲突。它维护数据的多个版本,使事务能读旧数据而写新数据,无需锁定记录。当前读获取最新版本,加锁防止修改;快照读不加锁,根据读取时的读视图(readview)决定读哪个版本。InnoDB通过隐藏字段(DB_TRX_ID, DB_ROLL_PTR)和undo log存储版本,readview记录活跃事务ID。读已提交每次读取都创建新视图,可重复读则在整个事务中复用一个视图,确保一致性。MVCC通过undo log版本链和readview规则决定事务可见性,实现了非阻塞并发读。
2126 5
聊多版本并发控制(MVCC)
|
5月前
|
API 开发工具 Android开发
阿里云移动推送(智能推送)完全对接指南:从控制台配置到服务端API深度集成
本文提供了一份完整的阿里云移动推送(智能推送)服务对接指南。首先需在EMAS控制台创建应用并获取AppKey,同时完成Android厂商通道密钥配置与iOS推送证书上传。客户端集成方面,Android与iOS平台需分别接入对应SDK并完成初始化,HarmonyOS平台也已全面支持。服务端对接基于PushV2接口,支持Java、Python、Node.js、PHP等多语言SDK,通过结构化JSON请求体可灵活构建面向设备、账号、别名、标签等多种目标的推送任务。厂商通道与辅助弹窗机制是提升Android端送达率的核心,需在控制台配置各厂商密钥并在客户端接入辅助弹窗以处理离线通知。标签与别名管理可实
|
11月前
|
网络协议 Linux Shell
阿里云安装freeswitch的步骤总结
本文介绍在阿里云上安装freeswitch系统三种安装方式:脚本、镜像及Docker。支持多种Linux系统,推荐最小化安装,提供下载地址、一键安装命令及卸载方法。安装后访问IP即可登录,默认账号密码为admin/admin,初始化需等待5-10分钟。
1365 5
|
11月前
|
人工智能 API 开发工具
分享一款端侧AI部署工具Nexa SDK
2025年AI硬件爆发,但云端大模型面临成本高、隐私差、延迟大等问题。开源小模型崛起,推动边缘AI发展。Nexa SDK应运而生,提供跨平台统一推理框架,支持NPU/GPU/CPU深度适配,实现低代码、高性能、多模态模型Day-0支持,兼容OpenAI API,助力手机、PC、汽车、IoT等端侧AI快速落地,重塑智能体验。
2069 1
|
9月前
|
运维 监控 API
OpenClaw(Clawdbot)AI Agent 全栈指南:阿里云+本地部署+监控仪表盘,运维效率翻倍
2026年,OpenClaw(前身Clawdbot/Moltbot)以19万+GitHub星标成为现象级本地AI Agent项目,其丰富的技能生态让自动化办公、开发辅助等场景落地成为可能。但随着使用深入,用户普遍面临一个痛点:原生OpenClaw仅提供基础日志查看功能,无法直观掌握运行状态——模型调用成本、网关健康、Cron任务执行情况、Token消耗等关键信息分散在不同文件中,运维效率极低。
1946 12
|
机器学习/深度学习 人工智能 API
AI 发展 && MCP
AI发展——计算机视觉、ChatGPT、Sora、DeepSeek、生成式AI。什么是MCP,Prompt、LLM、Function Call、Agent、MCP是什么,各自区别;MCP如何工作,MCP架构、MCP Server工作原理,Cursor如何使用MCP,自定义MCP Server
1914 46
|
存储 消息中间件 缓存
RocketMQ原理—3.源码设计简单分析下
本文介绍了Producer作为生产者是如何创建出来的、启动时是如何准备好相关资源的、如何从拉取Topic元数据的、如何选择MessageQueue的、与Broker是如何进行网络通信的,Broker收到一条消息后是如何存储的、如何实时更新索引文件的、如何实现同步刷盘以及异步刷盘的、如何清理存储较久的磁盘数据的,Consumer作为消费者是如何创建和启动的、消费者组的多个Consumer会如何分配消息、Consumer会如何从Broker拉取一批消息。
751 11
RocketMQ原理—3.源码设计简单分析下