当前位置: 首页 > news >正文

Java Nio核心概念理解

SelectionKey:A token representing the registration of a SelectableChannel with a Selector。A selection key is created each time a channel is registered with a selector。

A selection key is created each time a channel is registered with a selector。 A key remains valid until it is cancelled by invoking its cancel method, by closing its channel, or by closing its selector。 Cancelling a key does not immediately remove it from its selector; it is instead added to the selector’s ancelled-key set for removal during the next selection operation。The validity of a key may be tested by invoking isValid method。

SelectionKey包含两种operation sets:interest set & ready set。

  • Interest set:兴趣集,表示已注册的事件集合,下一次调用方法,将测试是否有此事件的加入。通过SelectionKey的 int interestOps() 方法,可以获取当前 SelectionKey的感兴趣事件。
  • Ready set:准备集,表示已准备就绪的事件集合。通过SelectionKey的 int readyOps()方法,可以获取当前 SelectionKey的准备就绪事件。

Nio中 SocketChannel 如果设置为非阻塞方式,在其发起connect连接事件后返回的永远为false,必须显式调用finishConnect来判断连接是否成功建立。相反,如果 SocketChannel 设置为阻塞方式,则connect方法会根据连接情况返回true or false。

SocketChannel 执行connect事件之后,此时连接处于pending(待定)状态,只有显式调用finishConnect之后则连接更新为CONNECTED状态。否则出现异常NotYetConnectedException。

客户端异常关闭(直接中断idea进程),会导致服务器端一直不断收到客户端的OP_READ事件,即selector.select()会直接通过,并且是可读状态,但是实际上读到的数据是空的。

由于底层epoll机制的问题,导致select方法可能会一直返回0,造成无限循环的情况。

相关文章:

  • 关于 Mybatis 的开启二级缓存返回对象不一致问题
  • 嵌入式PCB制图面试题及参考答案(2万字长文)
  • 【融合ChatGPT等AI模型】Python-GEE遥感云大数据分析、管理与可视化及多领域案例应用
  • 【2024德国签证】去德国读博士需要申请什么签证?
  • Spire.PDF for .NET【文档操作】演示:以特定的缩放比例/百分比打开 PDF 文件
  • 力扣习题--哈沙德数
  • Redis Stream Redisson Stream
  • Cube-Studio:开源大模型全链路一站式中台
  • 千益畅行,旅游卡,如何赚钱?
  • 【区块链+基础设施】国家健康医疗大数据科创平台 | FISCO BCOS应用案例
  • AMSA-UNet | 基于自注意力的多尺度 U-Net 提升图像去模糊性能
  • 「ETL趋势」FDL数据开发支持版本管理、实时管道支持多对一、数据源新增支持神通
  • element-plus Transfer 穿梭框半成品
  • 10年铲屎官亲自体验后,告诉你好用的空气净化器排名
  • Kotlin基础——异步和并发
  • [deviceone开发]-do_Webview的基本示例
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Android 架构优化~MVP 架构改造
  • chrome扩展demo1-小时钟
  • gf框架之分页模块(五) - 自定义分页
  • Iterator 和 for...of 循环
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • PaddlePaddle-GitHub的正确打开姿势
  • Redis中的lru算法实现
  • Unix命令
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 开源地图数据可视化库——mapnik
  • 力扣(LeetCode)357
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何设计一个比特币钱包服务
  • 入口文件开始,分析Vue源码实现
  • 使用docker-compose进行多节点部署
  • 无服务器化是企业 IT 架构的未来吗?
  • 线性表及其算法(java实现)
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ### RabbitMQ五种工作模式:
  • #etcd#安装时出错
  • #NOIP 2014# day.1 T2 联合权值
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (六)Hibernate的二级缓存
  • (转)visual stdio 书签功能介绍
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET/C# 的字符串暂存池
  • .net连接MySQL的方法
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • @Autowired @Resource @Qualifier的区别
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @EnableWebMvc介绍和使用详细demo
  • [ 网络通信基础 ]——网络的传输介质(双绞线,光纤,标准,线序)
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [4]CUDA中的向量计算与并行通信模式