Selector API用法

TestCafe API 深入了解 TestCafe 的核心概念、API 用法、高级功能、最佳实践。 阅读详情

java.nio.channels
类 Selector

java.lang.Object
  继承者 java.nio.channels.Selector
直接已知子类:
AbstractSelector

public abstract class Selector
    
     extends Object
    
 
 

SelectableChannel 对象的多路复用器。

可通过调用此类的 open 方法创建选择器,该方法将使用系统的默认选择器提供者创建新的选择器。也可通过调用自定义选择器提供者的 openSelector 方法来创建选择器。通过选择器的 close 方法关闭选择器之前,它一直保持打开状态。

通过 SelectionKey 对象来表示可选择通道到选择器的注册。选择器维护了三种选择键集:

  • 键集 包含的键表示当前通道到此选择器的注册。此集合由 keys 方法返回。

  • 已选择键集 是这样一种键的集合,即在前一次选择操作期间,检测每个键的通道是否已经至少为该键的相关操作集所标识的一个操作准备就绪。此集合由 selectedKeys 方法返回。已选择键集始终是键集的一个子集。

  • 已取消键集 是已被取消但其通道尚未注销的键的集合。不可直接访问此集合。已取消键集始终是键集的一个子集。

在新创建的选择器中,这三个集合都是空集合。

通过某个通道的 register 方法注册该通道时,所带来的副作用是向选择器的键集中添加了一个键。在选择操作期间从键集中移除已取消的键。键集本身是不可直接修改的。

不管是通过关闭某个键的通道还是调用该键的 cancel 方法来取消键,该键都被添加到其选择器的已取消键集中。取消某个键会导致在下一次选择操作期间注销该键的通道,而在注销时将从所有选择器的键集中移除该键。

通过选择操作将键添加到已选择键集中。可通过调用已选择键集的 remove 方法,或者通过调用从该键集获得的 iterator 的 remove 方法直接移除某个键。通过任何其他方式从不会将键从已选择键集中移除;特别是,它们不会因为影响选择操作而被移除。不能将键直接添加到已选择键集中。

选择

在每次选择操作期间,都可以将键添加到选择器的已选择键集以及从中将其移除,并且可以从其键集和已取消键集中将其移除。选择是由 select()、select(long) 和 selectNow() 方法执行的,执行涉及三个步骤:

  1. 将已取消键集中的每个键从所有键集中移除(如果该键是键集的成员),并注销其通道。此步骤使已取消键集成为空集。

  2. 在开始进行选择操作时,应查询基础操作系统来更新每个剩余通道的准备就绪信息,以执行由其键的相关集合所标识的任意操作。对于已为至少一个这样的操作准备就绪的通道,执行以下两种操作之一:

    1. 如果该通道的键尚未在已选择键集中,则将其添加到该集合中,并修改其准备就绪操作集,以准确地标识那些通道现在已报告为之准备就绪的操作。丢弃准备就绪操作集中以前记录的所有准备就绪信息。

    2. 如果该通道的键已经在已选择键集中,则修改其准备就绪操作集,以准确地标识所有通道已报告为之准备就绪的新操作。保留准备就绪操作集以前记录的所有准备就绪信息;换句话说,基础系统所返回的准备就绪操作集是和该键的当前准备就绪操作集按位分开 (bitwise-disjoined) 的。

    如果在此步骤开始时键集中的所有键都有空的相关集合,则不会更新已选择键集和任意键的准备就绪操作集。
  3. 如果在步骤 (2) 的执行过程中要将任意键添加到已取消键集中,则处理过程如步骤 (1)。

是否阻塞选择操作以等待一个或多个通道准备就绪,如果这样做的话,要等待多久,这是三种选择方法之间的唯一本质差别。

并发性

选择器自身可由多个并发线程安全使用,但是其键集并非如此。

选择操作在选择器本身上、在键集上和在已选择键集上是同步的,顺序也与此顺序相同。在执行上面的步骤 (1) 和 (3) 时,它们在已取消键集上也是同步的。

在执行选择操作的过程中,更改选择器键的相关集合对该操作没有影响;进行下一次选择操作才会看到此更改。

可在任意时间取消键和关闭通道。因此,在一个或多个选择器的键集中出现某个键并不意味着该键是有效的,也不意味着其通道处于打开状态。如果存在另一个线程取消某个键或关闭某个通道的可能性,那么应用程序代码进行同步时应该小心,并且必要时应该检查这些条件。

阻塞在 select() 或 select(long) 方法之一中的某个线程可能被其他线程以下列三种方式之一中断:

  • 通过调用选择器的 wakeup 方法,

  • 通过调用选择器的 close 方法,或者

  • 在通过调用已阻塞线程的 interrupt 方法的情况下,将设置其中断状态并且将调用该选择器的 wakeup 方法。

close 方法在选择器上是同步的,并且所有三个键集都与选择操作中的顺序相同。

一般情况下,选择器的键和已选择键集由多个并发线程使用是不安全的。如果这样的线程可以直接修改这些键集之一,那么应该通过对该键集本身进行同步来控制访问。这些键集的 iterator 方法所返回的迭代器是快速失败 的:如果在创建迭代器后以任何方式(调用迭代器自身的 remove 方法除外)修改键集,则会抛出 ConcurrentModificationException。

从以下版本开始:
1.4
另请参见:
SelectableChannel, SelectionKey

构造方法摘要
protected Selector()           初始化此类的一个新实例。

 

方法摘要
abstract  voidclose()           关闭此选择器。
abstract  booleanisOpen()           告知此选择器是否已打开。
abstract  Set<SelectionKey>keys()           返回此选择器的键集。
static Selectoropen()           打开一个选择器。
abstract  SelectorProviderprovider()           返回创建此通道的提供者。
abstract  intselect()           选择一组键,其相应的通道已为 I/O 操作准备就绪。
abstract  intselect(long timeout)           选择一组键,其相应的通道已为 I/O 操作准备就绪。
abstract  Set<SelectionKey>selectedKeys()           返回此选择器的已选择键集。
abstract  intselectNow()           选择一组键,其相应的通道已为 I/O 操作准备就绪。
abstract  Selectorwakeup()           使尚未返回的第一个选择操作立即返回。

 

从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

 

构造方法详细信息

Selector

protected Selector()
初始化此类的一个新实例。

方法详细信息

open

public static Selector open()
                     throws IOException
打开一个选择器。

通过调用系统级默认 SelectorProvider 对象的 openSelector 方法来创建新的选择器。

返回:
新的选择器
抛出:
IOException - 如果发生 I/O 错误

isOpen

public abstract boolean isOpen()
告知此选择器是否已打开。

返回:
当且仅当此选择器已打开时才返回 true

provider

public abstract SelectorProvider provider()
返回创建此通道的提供者。

返回:
创建此通道的提供者

keys

public abstract Set<SelectionKey> keys()
返回此选择器的键集。

不可直接修改键集。仅在已取消某个键并且已注销其通道后才移除该键。试图修改键集会导致抛出 UnsupportedOperationException。

键集是非线程安全的。

返回:
此选择器的键集
抛出:
ClosedSelectorException - 如果此选择器已关闭

selectedKeys

public abstract Set<SelectionKey> selectedKeys()
返回此选择器的已选择键集。

可从已选择键集中移除键,但是无法直接添加键。试图向该键集中添加对象会导致抛出 UnsupportedOperationException。

已选择键集是非线程安全的。

返回:
此选择器的已选择键集
抛出:
ClosedSelectorException - 如果此选择器已关闭

selectNow

public abstract int selectNow()
                       throws IOException
选择一组键,其相应的通道已为 I/O 操作准备就绪。

此方法执行非阻塞的选择操作。如果自从前一次选择操作后,没有通道变成可选择的,则此方法直接返回零。

调用此方法会清除所有以前调用 wakeup 方法所得的结果。

返回:
由选择操作更新其准备就绪操作集的键的数目,该数目可能为零
抛出:
IOException - 如果发生 I/O 错误
ClosedSelectorException - 如果此选择器已关闭

select

public abstract int select(long timeout)
                    throws IOException
选择一组键,其相应的通道已为 I/O 操作准备就绪。

此方法执行处于阻塞模式的选择操作。仅在至少选择一个通道、调用此选择器的 wakeup 方法、当前的线程已中断,或者给定的超时期满(以先到者为准)后此方法才返回。

此方法不提供实时保证:它安排了超时时间,就像调用 Object.wait(long) 方法一样。

参数:
timeout - 如果为正,则在等待某个通道准备就绪时最多阻塞 timeout 毫秒;如果为零,则无限期地阻塞;必须为非负数
返回:
已更新其准备就绪操作集的键的数目,该数目可能为零
抛出:
IOException - 如果发生 I/O 错误
ClosedSelectorException - 如果此选择器已关闭
IllegalArgumentException - 如果 timeout 参数的值为负

select

public abstract int select()
                    throws IOException
选择一组键,其相应的通道已为 I/O 操作准备就绪。

此方法执行处于阻塞模式的选择操作。仅在至少选择一个通道、调用此选择器的 wakeup 方法,或者当前的线程已中断(以先到者为准)后此方法才返回。

返回:
已更新其准备就绪操作集的键的数目,该数目可能为零
抛出:
IOException - 如果发生 I/O 错误
ClosedSelectorException - 如果此选择器已关闭

wakeup

public abstract Selector wakeup()
使尚未返回的第一个选择操作立即返回。

如果另一个线程目前正阻塞在 select() 或 select(long) 方法的调用中,则该调用将立即返回。如果当前未进行选择操作,那么在没有同时调用 selectNow() 方法的情况下,对上述方法的下一次调用将立即返回。在任一情况下,该调用返回的值可能是非零的。如果未同时再次调用此方法,则照常阻塞 select() 或 select(long) 方法的后续调用。

在两个连续的选择操作之间多次调用此方法与只调用一次的效果相同。

返回:
此选择器

close

public abstract void close()
                    throws IOException
关闭此选择器。

如果某个线程目前正阻塞在此选择器的某个选择方法中,则中断该线程,如同调用该选择器的 wakeup 方法那样。

所有仍与此选择器关联的未取消键已无效、其通道已注销,并且与此选择器关联的所有其他资源已释放。

如果此选择器已经关闭,则调用此方法无效。

关闭选择器后,除了调用此方法或 wakeup 方法外,以任何其他方式继续使用它都将导致抛出 ClosedSelectorException。

抛出:
IOException - 如果发生 I/O 错误
一个基于jQuery 实现的jSelectDate 下拉日期选择器插件源码 立即下载

相关推荐

微波传感器 - 从原理到实战,解锁非接触感知新维度

本文深入解析微波传感器的工作原理,重点阐述了其基于多普勒效应的非接触感知机制,并对比了红外、超声波等技术的优劣。通过树莓派Pico与RCWL-0516模块的实战案例,展示了如何构建区域入侵检测器,并探讨了微波传感器在智能家居、工业自动化及汽车电子等领域的广阔应用前景。

weixin_29306571的博客 223

NIO服务端(客户端断开也正常运行)和客户端实现

NIO服务端(客户端断开也正常运行)和客户端实现 NIO的三大核心对象:缓冲区(Buffer)、选择器(Selector)、通道(Channel) NIO 的工作原理: 由一个专门的线程来处理所有的 IO 事件,并负责分发。 事件驱动机制:事件到的时候触发,而不是同步的去监视事件。 线程通讯:线程之间通过 wait,notify 等方式通讯。保证每次上下文切换都是有意义的。减少无谓的线程切换。 一、服务端实现 import java.io.IOException; import java.net.Ine

weixin_41358538的博客 297

当版图同学只给GDS文件时,我是这样用Calibre PEX和Cadence做后仿真的(保姆级避坑)

本文详细介绍了在模拟IC设计中,当仅获得GDS文件时,如何利用Calibre PEX和Cadence进行高效后仿真的完整流程。涵盖从寄生参数提取到Spectre模型创建的实战技巧,特别针对版本兼容性、文件独立性和参数可调性等常见问题提供解决方案,帮助工程师规避协作中的典型陷阱。

weixin_42556197的博客 243

Selector API介绍

前言 Selector是NIO编程中一个非常重要的核心组件,Selector类是一个抽象类,常用方法如下。

程序员劝退师的博客 329

用MATLAB从零实现六足机器人步态仿真:交替三角与波动步态保姆级教程

本文详细介绍了如何使用MATLAB从零实现六足机器人的两种经典步态仿真:交替三角支撑步态和波动步态。通过参数定义、相位设置、运动轨迹生成和三维可视化等步骤,帮助读者掌握六足机器人步态规划的核心技术。教程包含完整代码和详细解析,适合机器人爱好者和相关专业学生学习实践。

weixin_26765363的博客 227

Flutter for web 首次加载过慢问题优化

Flutter web 加载慢优化

Bright_TY的专栏 7836

H5使用Selectors API简化选取操作

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)、博主微信(guyun297890152)、QQ技术交流群(183198395)。 一、介绍 先看看以前查找元素的js方法 尽管DOM作为API已经非常完善了,但是为了实现更多的功能,DOM仍然进行了扩展,其中一个重要的扩展就是对选择器API的扩展。有了新的Selectors API后,...

孤云博客 675

Java农产品质量溯源大数据管理系统源码

产品追溯基于“一物一码”从工厂生产环节至销售阶段,赋予产品唯一的数码,并关联产品名称、批号、生产时间等信息,建立包装关联关系,为后期产品的追溯、营销搭建信息基础。 农产品溯源,从原材料收购、生产、加工质检到包装运输、终端门店销售等环节追溯,可以保证产品质量,监管部门和消费者都可以查询产品信息。对生产进行层层把关、一旦发现问题、立即进行处理、提升产品质量。

xingchen优快云的博客 1805

DOM选择器革命!Selectors API:前端开发的隐形武器,让你的代码效率翻倍!

(选择符API)是W3C制定的一项标准,其核心目标是让浏览器原生支持CSS选择器,开发者可以直接用类似CSS的语法来操作DOM元素。:返回第一个匹配的元素。:返回所有匹配的元素列表。这两个方法不仅简化了代码,还让开发者能够用更少的代码完成更复杂的任务。比如,想要获取页面中所有类名为highlight的<p>而传统方法可能需要嵌套调用和,代码冗长且易出错。从传统的到现代的,Selectors API不仅简化了DOM操作,更让开发者能够以更优雅的方式应对复杂的场景。

JakeMa1024的博客 834

卸载重装Ubuntu22.04双系统

先说一下写此篇文章的背景吧,我在Windows下配置了三个cornerNet深度学习环境分别是cuda10.3(显卡版本太高不支持),cuda11.3(配置后偶然看到一篇说这个版本win下只能用CPU跑),最后是cuda11.1终究还是没能跑通代码,因为它的代码是在Liunx系统写的,就想着装个Ubuntu试试看,在网上看说一般软件不要装太高版本,我就下载了470版的显卡驱动,跟着步骤升级了系统内核,结果第二天开机Ubuntu就崩了,开机黑屏左上角只有一道横杠显示,只能按ctrl+shift+f5进入命令窗

编程小白的博客 8106

创意视觉项目实战:用ESP32-S3+OV5640构建智能图像流系统

本文详细介绍了如何使用ESP32-S3开发板与OV5640摄像头模块构建智能图像流系统。从硬件连接到软件配置,涵盖Arduino环境搭建、图像采集优化、WiFi视频流传输及外设集成,为开发者提供完整的实战指南,助力智能家居和机器人视觉项目开发。

tech5的博客 1291

Java NIO之Selector详细理解

介绍 Selector一般称为选择器。它是Java NIO核心组件之一,选择器管理着一个被注册的通道集合的信息和它们的就绪状态。通道是和选择器一起被注册的,并且使用选择器来更新通道的就绪状态。 可选择通道(SelectableChannel) 抽象类SelectableChannel提供了实现通道的可选择性所需要的公共方法。继承该SelectableChannel的通道(如:socket通道)都是可选择的,因此可以配置成非阻塞模式。 //可以注册的Cha...

skh2015java的博客 1591

2022年灌溉试验设计与数据分析考试试题

2.表2数据为表层0~10cm的原状土离心机土壤水分特征曲线试验数据,(1)请利用R语言nls函数通过Van Genuchten方程对土壤体积含水率和土壤基质势进行拟合;(3)指明土壤基值势为-33 kPa和-1500kPa时的体积含水率。1.请根据表1数据,以灌溉模式为主区,生物炭用量为子区,利用R语言agricolae包生成裂区试验设计试验处理布置图;3.以R工具包factoextra中decathlon2数据集前10列为数据进行PCA分析,要求计算出(1)前5个主成分的特征值、特征向量;

Mrrunsen的博客 265

Java NIO之Selector

Java NIO之Selector Selector常用方法 //创建selector Selector selector = Selector.open(); //阻塞并等待就绪的通道的出现(select()方法返回的int值表示有多少通道已经就绪) int readyNum = selector.select(); //阻塞等待timeout时间,若无就返回 int readyNum = selector.select(long timeout); //非阻塞,只要有通道就绪就立刻返回就绪数量 i

qq_43203949的博客 295

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

三.Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)

前言 上一章节我们理解了Java NIO三大核心,以及重点讲解了Buffer的原理和几个使用场景,其中也用到了channel。这一章我们来理解一下selector,结合channel来做一个c/s通信。 理解Selector Selector 选择器,也叫多路复用器,可以同时处理多个客户端连接,多路复用器采用轮询机制来选择有读写事件的客户端链接进行处理。 通过 Selector ,一个 I/O 线程可以并发处理 N 个客户端连接和读写操作,这解决了传统同步阻塞 I/O 一连接一线程模型,架构的性能、弹性伸

墨家巨子@俏如来 4025

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

基于Python的selenium入门超详细教程(第1章)--WebDriver API篇

前面已经对selenium有了简单的了解,Selenium 是一个用于 Web 应用程序测试的工具集,它能够模拟用户在浏览器中的操作,比如点击按钮、输入文本、切换页面等。通过 Selenium,我们可以轻松地与各种主流浏览器(如 Chrome、Firefox、Edge 等)进行交互,为自动化测试提供了坚实的基础并且已经在Python环境下搭建好了selenium环境,从这篇开始,将正式学习selenium的webdriver框架。

lastriches的博客 2388

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java NIO Selector(三)

通过Selector选择通道 一旦向Selector注册了一或多个通道,就可以调用几个重载的select()方法。这些方法返回你所感兴趣的事件(如连接、接受、读或写)已经准备就绪的那些通道。换句话说,如果你对“读就绪”的通道感兴趣,select()方法会返回读事件已经就绪的那些通道。 下面是select()方法: select()阻塞到至少有一个通道在你注册的事件上就绪了。 select(long timeout)和select()一样,除了最长会阻塞timeout毫秒(参数)。 selectNow()

sysocc的博客 223

Recoil核心API详解:从基础概念到高级用法

Recoil核心API详解:从基础概念到高级用法 【免费下载链接】Recoil Recoil is an experimental state management library for React apps. It provides several capabilities that are difficult to...

gitblog_00330的博客 370

Java NIO API详解

NIO API 主要集中在 java.nio 和它的 subpackages 中:   java.nio 定义了 Buffer 及其数据类型相关的子类。其中被 java.nio.channels 中的类用来进行 IO 操作的 ByteBuffer 的作用非常重要。   java.nio.channels 定义了一系列处理 IO 的 Channel 接口以及这些接口在文件系统和网络通讯...

huchangan2005678的博客 149

Flutter for OpenHarmony三方库适配实战:file_selector文件选择详解

文件选择是移动应用和桌面应用中非常常见的功能,无论是上传文档、导入配置文件、选择媒体资源还是批量处理文件,都需要使用到文件选择器。在 Flutter for OpenHarmony 应用开发中, 是一个功能强大的文件选择插件,提供了完整的文件选择和管理功能,支持多种文件类型过滤和自定义配置。file_selector 库基于 Flutter 平台接口实现,提供了以下核心特性:单文件选择:支持选择单个文件,返回 对象,包含文件路径、名称、大小等信息。适用于头像上传、文档导入等场景。多文件选择:支持一次选择多

2501_92193083的博客 437

像专家一样猎杀图形Bug:NX2navi的Maxwell与Vulkan 60项行为差异实战手册

NX2navi 是把《塞尔达传说:时之笛》Nintendo Switch 2 版本重编译为 Windows 原生程序、并采用 Vulkan 渲染器移植图形项目的完整工程。它必须在 PC 的 Vulkan / AMD GPU 上逐条复现 Switch 2 上 Maxwell GPU 与 NVN 图形的行为。这份手册整理了渲染目标、纹理、着色器数学、内存模型、固定功能五大类的 60 余项行为差异,以及

gitblog_01091的博客 860

Selenium API

Selenium API基础 元素的定位 1.元素的定位(id) from selenium import webdriver driver = webdriver.Firefox() driver.get("https://www.baidu.com/") # 定位元素id skr = driver.find_element_by_id("kw") # 输入内容 skr.send_keys("12306") 2.元素的定位(name) from selenium import webdriver

weixin_45971531的博客 116

(一)NIO编程之NIO与BIO

BIO编程

BestQiang的博客 1万+
上一篇: SelectableChannel API 用法
下一篇: ServerSocketChannel API用法
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值