一、Selector是什么

Selector是一个或多个SelectableChannel对象的多路复用器.

二、如何创建一个Selector对象

  1. 一个selector对象可以通过调用Selector.open()来创建,这个工厂方法会使用系统默认的selector provider来创建一个新的selector对象。或者我们还可以通过实现抽象类SelectorProvider自定义一个selector provider,然后调用它的openSelector()来创建, 例如:new SelectorProviderImpl().openSelector()
  2. 除非调用selector.close(),否则该selector将会一直保持打开状态。

三、如何将selectable channel注册到selector中

SelectionKey key = channel.register(selector,Selectionkey.XXX);
  1. 通过channel的register方法,将channel注册到给定的selector中,并返回一个表示注册关系的SelectionKey对象。

四、selector如何维护selection keys

一个selector维护着三个selection keys集合:

  1. key set包含着所有selectionKeys,当前所有注册到selector中的channel返回的注册关系SelectionKey都包含在内,这个集合可以通过selector.keys()方法返回。
  2. selected-key set 包含着一部分selectionKeys,其中的每个selectionKey所关联的channel在selectionoperation期间被检测出至少准备好了一个可以在兴趣集中匹配到的操作。这个集合可以通过调用selector.selectedKeys()方法返回。
  3. selected-keyset 一定是 key set 的子集。 cancelled-key set也包含着一部分selectionKeys,其中的每个selectionKey都已经被取消,但是所关联channel还没有被撤销登记。cancelled-key set 不能够被直接返回,但也一定是 key set 的子集。

对于一个新创建的selector其中这三个集合都是空着的。

  1. 通过channel的register方法,一个selectionKey被增加到selector的 key set 中。
  2. 无论通过channel.close()还是通过selectionKey.cancel()来取消一个selectionKey ,这个selectionKey都会被立即添加到selector的 cancelled-key set中,但是所关联的channel并没有立即被撤销登记,直到发生下次 selection operations,这些channel才被从selector中撤销登记,与此同时这些Cancelled keys才会被从这个selector的所有selectionKey set(可能是_key set_、selected-key set、cancelled-key set)中移除,但是不会影响这些集合本身。
  3. 在 selection operations 期间,一些selectionKey会被选中添加到 selected-key set 中。其中的每个key可以通过selectiedKeys.remove()或selectiedKeys.iterator().remove()直接从 selected-key set 中移除,除此之外不能够通过任何方式被直接移除。特殊的,selected-key set 中的keys还可以在 selection operations 期间被间接移除。但是是不可以直接向 selected-key set 添加key的。

五、selector如何选择就绪channel

  • 每次 selection operation 期间, keys都可以添加到或从selector’s selected-key set 被移除,同时也可- 以从它的 key 和 cancelled-key sets 被移除。 selection operation 可以被触发通过执行selector.select(),selector.select(long),和selector.selectNow() 方法,并且这些方法涉及到以下三个步骤:
  1. 首先每个位于 cancelled-key set
    中的key会从每个包含它的key集合中被移除,并且对应的channel会被撤销登记。这个步骤使得 cancelled-key set
    变为空。

  2. 查询底层操作系统来获得关于selector中剩余channel的就续事件从 selection operation
    开始截止到此刻的更新情况,只要哪个channel的就续事件的更新部分有至少一个与兴趣集中的操作匹配上,那么将会执行以下两个动作:

  1. 如果这个channel’s key 没有存在 于 selected-key set
    那么将它添加到这个集合中,并将它的就绪操作集(ready-operation set)修改成
    只包含使得channel被报告就绪的操作,任何先前记录在就绪操作集中的就绪信息都会被丢弃。
  1. 否则,如果这个channel’s key 存在 于 selected-key set ,那么就保留就绪操作集中先前的就绪信息,并将这些
    使得channel被报告就绪的操作 写入进去;总而言之,系统底层会通过按位与&操作更新当前就绪集。
  2. 如果这些Key的兴趣集为空,那么 selected-key set 和 keys’的就续集(ready-operation
    sets)都不会被更新。
  1. 如果在步骤(2)正在进行时将任何key添加到 cancelled-key set,则按步骤(1)处理它们。
  • selection operations 是否会阻塞等待一个或多个通道准备就绪,以及等待多长时间,这是三种选择方法之间唯一的本质区别。

六、selector线程安全吗

多线程并发情况下Selectors本身是线程安全的,但是他们所持有的key sets不是线程安全的。

selection operations 按顺序在selector本身,key set 和 selected-key set 上同步。 它们还在上面的步骤(1)和(3)期间在 canceled-key set 上同步。

在 selection operations 期间改变key的兴趣集,对于本次操作将不会产生任何影响;它们的影响将会在下次 selection operations 期间发生。

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

一个线程通过selector.select()或selector.select(long)方法产生的阻塞可以被其他线程用以下三种方式的任意一种来中断:

  1. By invoking the selector’s wakeup() method,

  2. By invoking the selector’s close() method, or

  3. By invoking the blocked thread’s interrupt() method, in which case itsinterrupt status will be set and the selector’s wakeup() method will
    be invoked.

selector.close() 在 selection operations 期间会顺序的同步selectorand all three key sets 。

一个selector的 key set 和 selected-key set 通常情况下是线程不安全的。如果一个线程想要修改这个集合,需要同步控制它。通过key集合的iterator()方法返回的Iterators提供了快速失败(fail-fast):如果在创建迭代器之后修改了set,除了通过调用迭代器自己的remove() 方法之外,将抛出ConcurrentModificationException 。

文章转自

完全理解NIO Selector相关推荐

  1. 深入理解NIO - Selector、ServerSocketChannel、SocketChannel底层原理

    IO多路复用模型 IO多路复用需要OS的支持,IO多路复用模型中,引入了一种新的系统调用,查询IO的就绪状态. 在Linux系统中,JavaNIO的Selector#select() 方法对应的系统调 ...

  2. Java NIO Selector详解(含多人聊天室实例)

    一.Java NIO 的核心组件 Java NIO的核心组件包括:Channel(通道),Buffer(缓冲区),Selector(选择器),其中Channel和Buffer比较好理解 简单来说 NI ...

  3. java实现一个socks5代理 一了解nio Selector的基本用法

    上面浏览器可以放心的将数据交给代理了,接下来做的是怎样处理这些数据,以及面对浏览器突然过来的很多连接如何处理他们,这就要用到javax.nio包下的东西了,下面做简单介绍,不会nio可以先去学习下ni ...

  4. 四、Java NIO Selector

    一.Java NIO 概述 二.Java NIO Channel 三.Java NIO Buffer 四.Java NIO Selector 五.Java NIO 扩展 一.Selector 简介 1 ...

  5. java nio Selector (新IO)分析

    Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 为什么 ...

  6. Java NIO——Selector机制源码分析---转

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

  7. NIO : selector、channel、buffer的实例

    不同的SelectableChannel所支持的操作是不同的.例如ServerSocketChannel代表一个ServerSocket,它就只支持OP_ACCEPT操作: 当Selector上注册的 ...

  8. NIO - Selector源码分析

    1. 背景 SelectableChannel对象的多路复用器. 可以通过调用Selector.open()方法创建Selector对象.Selector.open()方法会利用系统默认的Select ...

  9. Java NIO Selector , SelectionKey , SocketChannel , ServerSocketChannel

    一    NIO介绍 1. NIO是非阻塞的 NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,rea ...

最新文章

  1. Asp.net中具体的日期格式化用法
  2. USACO 做题小结
  3. android gridview 间隔线,Android开发之RecyclerView的间隔线处理
  4. Windows消息循环机制详细概述
  5. 一个交易平台源码,全源无接口
  6. [SHOI2001]小狗散步
  7. python使用scipy模块from scipy.misc import imread时报错:cannot import name imread问题解决
  8. 文库系统 文库网站建设仿百度文库 道客巴巴 豆丁
  9. 使用mutt和msmtp发送邮件
  10. 智慧职教云答案在哪里找_云课堂智慧职教答案哪里找?
  11. innodb引擎的三大特性,插入缓冲(change buffer),两次写(doule write),自适应哈希索引(AHI)
  12. Redis学习之缓存数据类型
  13. Blender雕刻模块:2.81新功能遮罩提取(Mask Extract)
  14. 易语言大漠对雷电模拟器中控后台的绑定
  15. 新一代杂志新一代杂志社新一代编辑部2022年第13期目录
  16. Prolific USB-to-Serial Comm Port驱动
  17. Linux9.23.1
  18. Qt项目一:简易计算器
  19. 新一代交通控制网与智慧公路建设
  20. 命令线程windbg之使用!list指令遍历双向链表

热门文章

  1. 日期正则表达式yyyyMMdd
  2. ArrayList、LinkedList、Vector的区别。
  3. ElasticSearch2.3.1环境搭建哪些不为人知的坑
  4. 一个多功能蓝色漂亮的搜索条
  5. 游戏开发模式一:组件模式(Component)
  6. 使用Visual Studio实现WinForm多语言版本实例
  7. Python学习笔记:异步IO(1)
  8. MPI 集合通信函数 MPI_Reduce(),MPI_Allreduce(),MPI_Bcast(),MPI_Scatter(),MPI_Gather(),MPI_Allgather(),MPI_S
  9. Android中添加背景音乐的两种方法
  10. 计算机游戏的英语怎么写,电脑游戏英语怎么写