可以通过调用此类的open方法来创建选择器,该方法将使用系统的默认selector provider来创建新选择器。 还可以通过调用自定义选择器提供程序的openSelector方法来创建选择器。 选择器保持打开状态,直到通过其close方法关闭。

可选择通道的选择器注册由SelectionKey对象表示。 选择器维护三组选择键:

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

所选择的密钥集是一组密钥,使得检测到每个密钥的信道准备好用于在先前的选择操作期间在密钥的兴趣集中识别的至少一个操作,该操作在该集合中添加密钥或更新密钥。 选定键集始终是键集的子集。

取消密钥集是已取消但其通道尚未取消注册的密钥集。 此套装无法直接访问。 取消密钥集始终是密钥集的子集。

在新创建的选择器中,所有三个组都是空的。

将一个键添加到选择器的键集,作为通过通道的register方法注册通道的副作用 。 在选择操作期间,取消的密钥将从密钥集中删除。 密钥集本身不能直接修改。

无论是通过关闭其通道还是通过调用其cancel方法,都会在取消选择器的取消键集时添加一个键。 取消密钥将导致其通道在下一个选择操作期间取消注册,此时密钥将从所有选择器的密钥集中删除。

通过选择操作将键添加到选定键集。 可以通过调用set的remove方法或通过调用从该集合获得的iterator的remove方法,直接从所选键集中移除键。 可以通过调用set的clear方法从所选键集中删除所有键。 密钥可能无法直接添加到选定密钥集。

选择

选择操作向底层操作系统查询关于每个注册信道的准备情况的更新,以执行由其密钥的兴趣集标识的任何操作。 选择操作有两种形式:

添加到所选键集的选择操作

在每个选择操作期间,可以将键添加到选择器的选定键组中以及从其中移除键,并且可以从其键和取消键组中移除键。

取消密钥集中的每个密钥将从其所属的每个密钥集中删除,并且其通道被取消注册。 此步骤将取消的密钥设置为空。

查询基础操作系统以获得关于每个剩余信道的准备情况的更新,以执行在其选择操作开始时由其密钥的兴趣集识别的任何操作。 对于已准备好进行至少一个此类操作的通道,将执行以下两个操作之一:

如果通道的密钥不在选择密钥集中,则将其添加到该集合中,并修改其就绪操作集以准确识别现在报告该通道准备就绪的那些操作。 先前记录在就绪集中的任何准备就绪信息都被丢弃。

否则,通道的密钥已经在选择密钥集中,因此修改其就绪操作集以识别报告信道已准备好的任何新操作。 先前记录在就绪集中的任何准备信息都被保留; 换句话说,底层系统返回的就绪集按位顺序分离到密钥的当前就绪集中。 如果在此步骤开始时设置的密钥中的所有密钥都具有空兴趣集,则所选密钥集和任何密钥的就绪操作集都不会更新。

如果在步骤(2)正在进行时将任何键添加到取消键组,则按步骤(1)处理它们。

选择操作是否阻止等待一个或多个通道准备就绪,以及如果等待多长时间,这是三种选择方法之间唯一的本质区别。

对所选键执行操作的选择操作

取消密钥集中的每个密钥将从其所属的每个密钥集中删除,并且其通道被取消注册。 此步骤将取消的密钥设置为空。

查询基础操作系统以获得关于每个剩余信道的准备情况的更新,以执行在其选择操作开始时由其密钥的兴趣集识别的任何操作。

对于一个信道准备好至少一个这样的操作中,准备好操作设定的通道的键的设置,以确定准确的量,信道准备的操作和指定给该动作 select方法被调用来消耗通道的键。 先前记录在就绪集中的任何就绪信息在调用动作之前被丢弃。

或者,在通道准备好进行多个操作的情况下,可以多次调用该动作 ,其中通道的键和就绪操作集被修改为通道准备就绪的操作的子集。 如果对同一个键多次调用该操作,则其就绪操作集永远不会包含在同一选择操作中先前调用该操作时包含在该集中的操作位。

如果在步骤(2)正在进行时将任何键添加到取消键组,则按步骤(1)处理它们。

并发

Selector及其密钥集可安全地供多个并发线程使用。 但是,它的选择键集和取消键集不是。

选择操作按顺序在选择键本集上的选择器本身上同步。 它们还在上面的步骤(1)和(3)期间在取消的密钥集上同步。

在选择操作正在进行时对选择器键的兴趣集所做的更改对该操作没有影响; 它们将在下一次选择操作中看到。

密钥可能会被取消,渠道可能随时关闭。 因此,在一个或多个选择器的密钥集中存在密钥并不意味着密钥有效或其信道是开放的。 如果有可能另一个线程取消密钥或关闭一个通道,应用程序代码应该小心地同步并检查这些条件。

在选择操作中被阻塞的线程可能会被以下三种方式之一的其他线程中断:

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

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

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

close方法以与选择操作中相同的顺序在选择器及其选择键集上同步。

Selector的密钥集对多个并发线程使用是安全的。 来自密钥集的检索操作通常不会阻塞,因此可能与添加到集合的新注册重叠,或者与从集合中移除密钥的选择操作的取消步骤重叠。 迭代器和分裂器在迭代器/分裂器创建时或之后的某个时刻返回反映集合状态的元素。

通常,选择器的选定密钥集不能安全地供多个并发线程使用。 如果这样的线程可能直接修改集合,则应通过同步集合本身来控制访问。 由set iterator方法返回的迭代器是快速失败的:如果在创建迭代器之后修改了set,除了通过调用迭代器自己的remove方法之外,将抛出ConcurrentModificationException 。

java selector wakeup_Selector相关推荐

  1. java selector 源码_基于selector的源码分析和理解、思想和应用实践

    来自京东架构师(JAVA)欢迎关注我的微信公众号java2arch,更多技术文章可看. 一个连接请求connetion request过来,产生一个通道channel(包含并封装了connection ...

  2. java selector 源码_Java NIO核心组件-Selector和Channel

    昨天我们介绍了一下SelectorProvider和IO multiplexing.特别是IO multiplexing中的epoll系统调用,是Linux版本的Java的NIO的核心实现. 那今天我 ...

  3. java selector 源码_Java NIO——Selector机制源码分析---转

    一直不明白pipe是如何唤醒selector的,所以又去看了jdk的源码(openjdk下载),整理了如下: 以Java nio自带demo : OperationServer.java   Oper ...

  4. Java爬取frame的课程表_超级课程表一键提取课程功能app及课表静态网页内容

    [实例简介] 内含app具体代码,可以编译,但是无法运行,因为具体的链接涉及到隐私问题,被我屏蔽,要想正常导入自己教务处的课表,请修改HttpUtil.java里对应的链接信息. 里面还含有三张课表的 ...

  5. Java NIO简介

    1. 介绍 在1.4版本之前,Java的IO库的阻塞IO,简称OIO(Old IO):其后开始,就引入了新的异步IO,称为Java New IO类库,简称Java NIO:主要解决的问题就是同步阻塞的 ...

  6. Java面试知识点(全)- Java面试基础部分三

    Java面试知识点(全)https://nanxiang.blog.csdn.net/article/details/130640392 注:随时更新 文章目录 ThreadPoolExecutor ...

  7. golang 学习笔记

    golang 简介 静态 强类型 编译型语言 GO语言适用场景及GO语言的优势 Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性.谷歌首席软件工程师罗布派克(R ...

  8. oracle rac 高并发性能_Tomcat 高并发之道原理拆解与性能调优

    高并发拆解核心准备 这回,再次拆解,专注 Tomcat 高并发设计之道与性能调优,让大家对整个架构有更高层次的了解与感悟.其中设计的每个组件思路都是将 Java 面向对象.面向接口.如何封装变与不变, ...

  9. 了解架构设计远远不够!一文拆解 Tomcat 高并发原理与性能调优

    来源 | 码哥字节 上帝视角拆解 Tomcat 架构设计,在了解整个组件设计思路之后.我们需要下凡深入了解每个组件的细节实现.从远到近,架构给人以宏观思维,细节展现饱满的美.关注「码哥字节」获取更多硬 ...

  10. 管你 JDK 还是 Linux,我 Netty 稳坐钓鱼台

    今天聊的也是一个老生常谈的问题了:JDK Selector 的空轮询 bug. 今天来简单地扒一下,这玩意大概能追溯到 06 年,并且基于这个 BUG 我们再发散下,看看能给我们什么启发. 追溯 最近 ...

最新文章

  1. JavaScript创建对象的两种方法和遍历对象的属性
  2. RDA5807 FM收音机模块
  3. 关于2021年 美赛论文 提交失败的解决方法
  4. 【HDU - 5922】Minimum’s Revenge(思维,最小生成树变形)
  5. html5怎么跟安卓交互,html5怎么与android交互
  6. c++ raiseexception产生异常_Day17_异常,线程
  7. 自拍就可以得到你自己的个人贴图 Gboard打造客制化贴图
  8. Dynamics 365的系统作业实体记录增长太快怎么回事?
  9. 微服务模块综合管理(模块视图管理,自动化热部署,前端资源实时刷新......)
  10. [HNOI2012 Matrix]
  11. 英美安全机构称俄罗斯正在暴力攻击全球数百家组织机构
  12. (day 18 - 辅助栈)剑指 Offer 30. 包含min函数的栈
  13. Harris角点检测原理分析
  14. ubuntu22.04编译PBRT-v4
  15. js上传图片转base64格式
  16. robbin界面 java_使用JAVA和C#开发Ribbon界面
  17. 微信小程序广告接入,小程序加广告
  18. 什么是html阅读,HTML 介绍
  19. html简繁体转换,在线繁体字转换工具
  20. 农场买了一羊,第一年是小羊,第二年底生一只,第三年不生,第四年底再生一只,第五年死掉

热门文章

  1. 本周论文推荐(迁移学习、图神经网络)
  2. 百面机器学习—6.PCA与LDA要点总结
  3. IoT技术架构与安全威胁
  4. 软件集成策略故事连载----集成这破活儿
  5. 理解x86架构的捷径
  6. 回顾|腾讯AI打败王者荣耀职业队,AI训练一天等于人类440年
  7. 一文读懂Xgboost
  8. Scikit-learn:最近邻搜索sklearn.neighbors
  9. java stax_XML编程总结(五)——使用StAX接口操作xml
  10. pandownload获取bdstoken失败怎么回事_巴菲特点透中国股市:假如你手中持有的股票早上快速拉高然后慢慢下跌,你晓得是怎么回事吗?...