NIO-SelectableChannel详解

SelectableChannel("可被选择"通道):抽象类,此类实现了InterruptableChannel接口."可选择"通道,就是noblocking通道,它的实现需要Selector的支持.因此这些Channel取名为"SelectableChannel"是可以理解的.

为 了和Selector(选择器)一起使用,此类的实例必须首先通过register方法进行注册.此方法返回一个表示该通道已向选择器注册的新 SelectionKey对象."注销"选择器绑定时,会释放分配给改通道的所有资源.需要通过selectionKey.cancel方式注销.调用 Channel.close()或者通过interrupt方式中断IO,都将会隐式的导致selectionKey的取消.一个通道只能注册一个 Selector.SelectableChannel在多线程环境中,也是安全的.

 

SelectableChannel 在设计时,是可以处于"阻塞"或"非阻塞"两种模式下(configureBlocking方法设定).在"阻塞"模式下,每个I/O操作完成之前,都会阻塞其他的IO操作(参见 Channels.write/read,read使用readLock,write使用writeLock同步.).

在"非阻塞"模式 下,永远不会阻塞IO操作,其将会使用Selector作为异步支持.即任何write和read将不阻塞,可能会立即返回.新创建的 SeletableChannel总是处于阻塞模式,如果需要使用selector多路复用,那么必须使用非阻塞模式(API级别控制).当向某个Selector注册时,此Channel必须处于noblocking模式,且此后模式不可改变,直到selectionKey销毁.

 

  • public abstract int validOps():获取此通道所支持的操作集合,同一种类型的Channel,将会得到相同的值,此值为 SelectionKey.OP_READ,OP_WRITE,OP_CONNECT,OP_ACCEPT操作的子集...位或运算之后的结果.
  • public abstract boolean isRegistered():检测当前通道是否已经注册了selector..当SelectionKey被注销之后,或者通道关闭后,仍然有可能返回 true.取消注册关系,有一定的延迟,selector的内部机制.稍后介绍.
  • public abstract SelectionKey keyFor(Selector sel): 获取当前通道注册在指定selector上的键.如果没注册,将返回null.
  • public final SelectionKey register(Selector sel,int ops,Object attr):参见AbsrtactSelectableChannel.register,将此通道注册在selector上,并获取相应的选择 键.ops为此通道感兴趣的操作集,attr为选择键中需要携带的"附件"信息.此方法主要目的,就是让channel与Selector建立关系,并让 selector为其支持异步操作.如果此时通道已关闭,则抛出ClosedChannelException.如果向selector提交的ops不是 当前Channel.validOps的子集,将抛出异常.(ops & ~ validOps() != 0,如果为true,则抛出异常);如果当前通道为blocking模式,则抛出IllegalBlockingModeException.如果当前通 道的选择键数组中,已经有和指定的selector的关联的键,则获得此键.每个SelectableChannel实例中,都有一个key[],这数组 结构保持了当前Channel所持有的注册成功的选择键,即每次register到不同的selector上,都有可能会导致key[]新增(如果先前已 经注册过的selector上,不会产生新的selectionKey);如果key[]通过遍历没有发现指定的selector产生的选择键,将会导致 底层生成新的选择键,然后加入到key[]中.当Channel.close()方法执行时,将会导致key[]中的相应selectionKey被 cancel.被cancel的key将会被存在Selector.cancelledKeys这个集合中,此集合将会被Selector内部实时调用, 然后清除,清除cancelKey时,将会释放channel资源以及移除channel中key[]的相应值(赋值为null).此方法内部,经过了同 步锁控制.与其说channel注册在selector上,尚不如说selector注册在channel上(思维要反转: 事实上的实现为Selector.register(channel,opts,attr)).

 

  • channel.register(selector,ops): 注册感兴趣的 事件,底层还是执行了当前channel对应的selectionKey.interstOps(ops);因此register注册的事件,和 selectionKey.interstOps(ops)是等效的,或者可以被修改的.
  • public abstract SelectableChannel configureBlocking(boolean block):配置当前channel的阻塞模式.基于selector的异步IO,必须为false.当前channel处于"非阻塞"模式下,如果改 成block模式时,将会抛出异常.
  • public abstract boolean isBlocking():检测当前通道的阻塞状态.默认直接返回Channel.blocking属性的值.

在AbstractSelectableChannel中有对部分方法实现,上述介绍均摘自它.不过不同的channel子类对部分方法的实现各不相同.稍后具体介绍.

AbstactSelectableChannel 中有2个同步锁:Object regLock和Object keyLock...regLock用于同步register()/configureBlocking()两种操作.keyLock用户同步 register()/close()/以及cancelKeys的移除.

Qwen2.5-VL模型微调实战:从零到部署的完整流程(附避坑指南) 本文详细介绍了Qwen2.5-VL视觉语言模型从零开始的完整微调与部署流程。内容涵盖使用LLaMA-Factory进行LoRA微调的关键参数配置与避坑指南,以及如何将训练好的模型权重合并,并最终利用vLLM高性能推理引擎进行部署,为开发者提供了一套可落地的实战方案。 阅读详情

相关推荐

使用cubeMX生成USB HID设备

本文主要介绍如何使用stm32开发板和cubeMX生成HID设备,供参考。

专注音频,高效工作,快乐生活! 970

java SelectableChannel虚拟类

文章目录总结SelectableChannel虚拟类方法register(Selector sel, int ops, Object att)方法详解register方法可能引发的异常 总结 SelectableChannel虚拟类是一种可通过Selector多路复用的通道,为了与选择器一起使用,必须首先通过register方法注册此类的实例。此方法返回一个新的SelectionKey对象,该对象表示频道在选择器中的注册,一旦向选择器注册,通道将保持注册状态,直到取消注册为止。这涉及取消选择器分配给通道的

weixin_45754452的博客 882

IPD实战指南:如何运用SPAN模型精准定位高潜力市场并优化资源配置

本文是IPD实战指南,详细解析了如何运用SPAN模型进行市场分析与战略决策。文章通过四步实战法,指导企业科学定义细分市场、量化评估吸引力与竞争力,并绘制矩阵以制定精准的资源配置策略,从而跳出红海竞争,将资源聚焦于高潜力市场。

weixin_29306317的博客 75

Java-NIO-Selector

1 概述 Selector一般称之为选择器,也可以翻译为多路复用器。它是Java-NIO中核心组件中的一个,用于检查一个或多个NIO Channel(通道)的状态是否处于可读、可写。如此可实现单线程管理多个channels,也就是可以管理多个网络连接。 使用Selector的好处在于:使用更少的线程来就可以处理通道了,相比使用多个线程,避免了线程上下文切换带来的开销 2 可选择通道(SelectableChannel) 1)不是所有的Channel都能够被Selector复用的。像F...

爪哇人的博客 1604

a股level2数据接口的最优委托信息

Level-1提供的数据并不可以知道委托了xxx手是有多少人下的,以及每个人下了多少的明细。通过Level-2的这个详细买卖盘数据,盘口上的单子到底是散户小打小闹,还是主力真刀实枪在干,都一览无余。交易类型:1-市价,2-限价,3-本方优先,10-撤单, 11-暂不清楚( 基金/ 债券有此值)除了提供逐笔成交记录这个信息外,还提供了最优委托信息,也就是盘口中前50笔订单的委托数量明细。那么Level-2盘口委托数据的速度更新是非常快的,大家可以通过。交易方向:0-未知,1-买入,2-卖出。

Qq_2037696191的博客 1168

损失函数大汇总(八)(IoU Loss附公式推导与代码)

本文详细介绍了IoU Loss及其在图像分割中的应用。IoU(交并比)是衡量预测区域与真实区域重叠程度的指标,IoU Loss定义为1-IoU,直接优化区域重叠质量。文章推导了IoU的数学表达式和梯度计算,分析了其函数特性:全局耦合梯度、对漏检误检的双重惩罚、适合类别不平衡任务。与Dice Loss相比,IoU更强调覆盖质量而非相似度。实际应用中IoU Loss常与BCE组合使用,前者保证训练稳定性,后者优化整体区域质量。文章还提供了IoU Loss的代码实现,适用于二值分割、小目标提取等场景,特别当任务评

悦学共鸣,温柔以待,汇聚光芒,共同成长 415

Java NIO 通道(三)选择器基础概念介绍

今天来学习NIO中另一个重要的知识,选择器。NIO这本书讲解的呢,说实话有点乱,感觉就是在翻译,乱的让人看不懂很多东西,所以这篇文章结合了一些博客去理解。NIO Select在选择器章节中,有三个很关键的角色,也是核心类,SelectableChannel,SelectionKey和Selector。1.SelectableChannelSelectableChannel是可选择通道,它可以被注册...

lwgzj的博客 837

利用 IP 中的集成调试功能来调试 PCI Express 链接训练问题

JTAG Debugger”和“In-system IBERT”功能结合在一起即可提供即时信息,用于判断链接训练问题的可能原因。“test_rd.tcl”文件可读取 BRAM 中存储的调试数据,并输出 *.dat 文件,如下所示。同样,您可能看到某一箭头旁的数字较大,表明可能存在不稳定的链接。要采集 PCIe 链接眼图,请在 IP 配置 GUI 的“Add. Debug Options”选项卡中选择“启用 In-System IBERT (Enable In-System IBERT)”选项。

qq_43416206的博客 535

SelectableChannel

SelectableChannel 可选通道的使用大致过程如下: 1. 新建通道 2. 将通道已经通道感兴趣的事件注册到选择器Selector上 3. 通过SelectKey获得需要处理的通道,然后对通道进行处理 SelectableChannel实现类 下图是SelectableChannel的实现类,可以看出主要分为几大块: 有关UDP协议的:DatagramChannel...

baidu_14922873的博客 910

STM32 IIC温湿度传感器(STH45)实验

精度 ΔRH = ±1.0 %RH, ΔT = ±0.1 °C• 平均电流:0.4 μA,空闲电流:80 nA• I2C FM、CRC 校验和、乘法。I2C 地址。• 专利保护选项 [1]、PTFE 膜和可拆卸保护盖• 工作范围:0 …100 %相对湿度,−40…125 摄氏度• 在冷凝环境中功能齐全• 动力加热器,真正的NIST可追溯性• JEDEC JESD47 认证 • 符合 ISO 17025 : 2017 的传感器专用校准证书,3 点温度校准。

baidu_34971492的博客 3072

【数据集】中国陆地生态系统通量观测网 ChinaFLUX

【数据集】中国陆地生态系统通量观测网 ChinaFLUX

WW、forever的博客 191

NIO之Selector解读

阻塞模式下,相关方法都会导致线程暂停ServerSocketChannel.accept 会在没有连接建立时让线程暂停SocketChannel.read 会在没有数据可读时让线程暂停阻塞的表现其实就是线程暂停了,暂停期间不会占用 cpu,但线程相当于闲置// 使用 nio 来理解非阻塞模式, 单线程// 1. 创建了服务器// 非阻塞模式// 2. 绑定监听端口// 3. 连接集合。

一个菜鸡的博客 1337

YOLOv8交通管理 详细解释及代码完整示例

YOLOv8在交通管理中的应用及代码实现 摘要:本文详细介绍了YOLOv8在交通管理领域的应用场景,包括车辆检测、违规行为识别和行人安全预警等。文章提供了完整的Python代码示例,展示了如何使用YOLOv8进行交通对象检测和车辆计数统计。代码包含模型加载、对象检测、结果可视化等功能模块,并给出了性能优化和功能扩展建议。该实现基于Ultralytics框架,支持多种YOLOv8模型选择,可根据实际需求调整模型大小和检测参数。

u010117029的博客 153

深入浅出 IO 多路复用:用 Java NIO 打造高性能网络应用

IO 多路复用是一种机制,允许一个线程同时监控多个文件描述符(在 Java 中为Channel),检查哪些通道可以执行 IO 操作(如读、写)。它通过事件驱动的方式,只在通道就绪时通知程序处理,避免了传统阻塞 IO 的资源浪费和非阻塞 IO 的忙轮询。在 Java 中,IO 多路复用主要通过 NIO 的Selector实现,底层依赖操作系统的多路复用机制(如 Linux 的 epoll、Windows 的 IOCP)。:跨平台,适合小规模连接。epoll(Linux):高性能,适合大规模并发。

算法小生 1204

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

NIO:解开非阻塞I/O高并发编程的秘密 _

Standard IO是对字节流的读写,在进行IO之前,首先创建一个流对象,流对象进行读写操作都是按字节 ,一个字节一个字节的来读或写。但是在写模式下,应用程序是可以进行读操作的,这就表示可能会出现脏读的情况。通道与流的不同之处在于,流只能在一个方向上移动(一个流必须是 InputStream 或者 OutputStream 的子类),而通道是双向的,可以用于读、写或者同时用于读写。I/O 与 NIO 最重要的区别是数据打包和传输的方式,I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。

bkYovXq8B的博客 236

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

java nio SelectionKey源码分析

目录 简介 构造函数,方法channel,selector,isValid,cancel 方法2个interestOps,readyOps 字段OP_XXX,方法isXXX(read,write,connect,accept) 字段attachment,attachmentUpdater,方法attach,attachment 简介 package java.nio.channels; import java.util.concurrent.atomic.AtomicReferenceFi

今天吃了吗的博客 400

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java `NIO` 之选择通道 `SelectableChannel` 示例 -- ISS(Ideas Should Spread)

本文是笔者 Java 学习笔记之一,旨在总结个人学习 Java 过程中的心得体会,现将该笔记发表,希望能够帮助在这方面有疑惑的同行解决一点疑惑,我的目的也就达到了。欢迎分享和转载,转载请注明出处,谢谢合作。由于笔者水平有限,文中难免有所错误,希望读者朋友不吝赐教,发现错漏我也会及时更新修改,欢迎斧正。(可在文末评论区说明或索要联系方式进一步沟通。) 本文发表地址是 我的 优快云 博...

keZhenxu 316

【Java源码阅读系列46】深度解读Java NIO SelectableChannel 源码

Java NIO(New Input/Output)的核心特性之一是多路复用(Multiplexing),通过 Selector 可以同时监控多个通道(Channel)的 I/O 事件,显著提升高并发场景下的性能。而 SelectableChannel 作为所有可被选择通道的抽象基类,是实现这一机制的关键桥梁。本文将结合源码,深入解析 SelectableChannel 的核心设计、关键方法及设计模式的应用。

专注Java和MySQL领域知识分享 1284

java nio SelectableChannel源码分析

简介 package java.nio.channels; import java.io.IOException; import java.nio.channels.spi.AbstractInterruptibleChannel; import java.nio.channels.spi.SelectorProvider; /** * 一种可以通过选择器多路复用的信道。 * * <p> 为了与选择器一起使用,必须首先通过register(Selector,int,Object

今天吃了吗的博客 486

Java NIO之Selector类与SelectableChannel类

Selector类 简介 Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。 官方文档的解释:SelectableChannel 对象的多路复用器 可通过调用此类的 open 方法创建选择器,该方法将使用系统的默认选择器提供者创建新的选择器

Coder_py的博客 2714

详解 NIO Selector

选择器(Selector)是一种用于实现 I/O 多路复用的组件,它允许一个线程同时监听多个通道(Channel)的事件,从而在不创建大量线程的情况下高效地处理高并发的网络连接。

2301_79609207的博客 1490

Java NIO之Selector、SelectableChannel和SelectorProvider

高性能IO模型浅析 http://www.cnblogs.com/fanzhidongyzby/p/4098546.html 系统间通讯方式之(Java NIO多路复用模式)(四) http://blog.youkuaiyun.com/u010963948/article/details/78507255 Java NIO之Selector、SelectableChan

猿类崛起 4291

《Java源码解析》之NIO的Selector机制(Part2:SelectableChannel.register(Selector sel, int ops))

通过上一篇博客,我们知道了Selector机制中的open()函数做了什么,其实也就是创建了一个管道,并把pipe的读写文件描述符放入pollArray中,这个pollArray是Selector的枢纽。下面我们抓取源码看一下channel在selector中注册时做了什么? SelectableChannel.register(Selector sel, int ops)SelectableCh

惜暮 3776

NIO的SelectableChannel关闭的一个问题

ocketChannel和ServerSocketChannel,两者的父类是SelectableChannel,它在jdk中的文档有这么段话: Once registered with a selector, a channel remains registered until it is deregistered.This involves deallocating whatever res...

yanlijun250 108

java nio 关闭channel_NIO的SelectableChannel关闭的一个问题

SocketChannel和ServerSocketChannel,两者的父类是SelectableChannel,它在jdk中的文档有这么段话:Once registered with a selector, a channel remains registered until it is deregistered.This involves deallocating whatever reso...

weixin_35241867的博客 425

NIO-Selector详解

Selector选择器,也可以称为多路复⽤器。它是Java NIO的核⼼组件之⼀,⽤于检查⼀个或多个Channel的状态是否处于可读、可写、可连接、可接收等。通过⼀个Selector选择器管理多个Channel,可以实现⼀个线程管理多个Channel对应的⽹络连接。使⽤单线程管理多个Channel可以避免多线程的线程上下⽂切换带来的额外开销。

z2698751935的博客 1887
上一篇: NIO-Channel相关接口详解
下一篇: NIO-SocketChannel详解
iteye_19607
博客等级 码龄8年 34粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值