NIO(3)--Selector
Selector是NIO中的可选择Channel(SelectableChannel)的multiplexor。有两个拗口的概念,首先是SelectableChannel,在NIO里并非所有的Channel都是可选择的,必须继承SelectableChannel的Channel才可以注册到Selector上,比如Socket下的Channel都继承了SelectableChannel,故Socket下的Channel是可以注册到Selector上的。其次是multiplexor,百度翻译给出的意思是多路选择器,其实就是IO多路复用,在Linux底层多路复用是通过select或者epoll等方法实现,在Java里把多路复用封装在了Selector里。所以Selector是JavaNIO的核心,因为首先对于本地文件的读取,BIO和NIO效率差别不大,因为BIO已经用NIO重写了(参考effective Java)。
Selector的创建通过其静态方法open,Selector的构造器是protected。Selector.open()默认调用系统默认的SelectorProvider作为selector provider创建新的Selector。
Channel key set
Selector内部维持了三个集合,用于存储不同状态的Channel。集合内存储的所谓的key是SelectionKey,每一个SelectionKey都代表着一对Channel和Selector的注册关系(A token representing the registration of a SelectableChannel with a link Selector)
key set
所有被注册到Selector上的Channel都会被加入到key set中。
- 获得:通过keys()方法返回所有注册的Channel
- 添加:不可以直接向key set中添加Channel,只能通过Channel.register方法
- 删除:通过SelectionKey.cancel方法。在一个SelectionKey调用cancel方法后,该SelectionKey会加入cancelled集合中,并在下次select过程中从Selector中移除
selected-key set
这个集合的每个成员都是被Selector判断为已经准备好的Channel。每个Channel在注册的时候都会注册一个世界,如读写等,当一个Channel可以读写的时候,Selector就会把该Channel对应的key移到selected-key set中。
- 获得:通过selectedKeys方法返回
- 添加:不可以直接添加,否则会抛出异常。selected-key set的添加是由Selector根据Channel的状态来完成的。
- 删除:调用SelectionKey.cancel方法
cancelled-key set
- 添加:SelectorKey.cancel和Channel.close方法,并且在下一次select过程中从cancelled中移除
选择
选择是Selector的核心,选择过程是对select epoll等本地方法调用的封装,目的是在所有注册的还未被取消的Channel中,即从key set中选择已经准备好的Channel,放入selected-key set中,并执行后续操作,实现一个线程监控多个IO,也就是传说中的IO多路复用。
NIO(3)--Selector的更多相关文章
- Java NIO类库Selector机制解析(下)
五. 迷惑不解 : 为什么要自己消耗资源? 令人不解的是为什么我们的Java的New I/O要设计成这个样子?如果说老的I/O不能多路复用,如下图所示,要开N多的线程去挨个侦听每一个Channel ...
- Java NIO类库Selector机制解析(上)
一. 前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但引入了全新的高效的I/O机制,同时,也引入了多路复用的异步模式.NIO的包中主要包含了这样几种抽象数据类型: ...
- NIO的Selector
参考自 Java NIO系列教程(六) Selector Java-NIO-Selector java.nio.channels.Selector NIO新功能Top 10(下) 出发点: 如何管理多 ...
- Java NIO 选择器(Selector)的内部实现(poll epoll)
http://blog.csdn.net/hsuxu/article/details/9876983 之前强调这么多关于linux内核的poll及epoll,无非是想让大家先有个认识: Java NI ...
- NIO组件Selector调用实例
*对于nio的非阻塞I/O操作,使用Selector获取哪些I/O准备就绪,注册的SelectionKey集合记录关联的Channel这些信息.SelectionKey记录Channel对buffer ...
- NIO组件Selector工作机制详解(上)
转自:http://blog.csdn.net/haoel/article/details/2224055 一. 前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但 ...
- Java NIO类库Selector机制解析--转
一. 前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但引入了全新的高效的I/O机制,同时,也引入了多路复用的异步模式.NIO的包中主要包含了这样几种抽象数据类型: ...
- Java NIO之Selector(选择器)
历史回顾: Java NIO 概览 Java NIO 之 Buffer(缓冲区) Java NIO 之 Channel(通道) 其他高赞文章: 面试中关于Redis的问题看这篇就够了 一文轻松搞懂re ...
- Nio使用Selector客户端与服务器的通信
使用NIO的一个最大优势就是客户端于服务器自己的不再是阻塞式的,也就意味着服务器无需通过为每个客户端的链接而开启一个线程.而是通过一个叫Selector的轮循器来不断的检测那个Channel有消息处理 ...
- Java NIO 选择器(Selector)的内部实现(poll epoll)(转)
转自:http://blog.csdn.net/hsuxu/article/details/9876983 之前强调这么多关于linux内核的poll及epoll,无非是想让大家先有个认识: Java ...
随机推荐
- socket简单实践
目录 socket模块: family(socket家族) fileno=None 请忽略,特殊用途 socket模块: 把tcp/ip协议层的各种数据封装啦.数据发送.接收等通过代码已经给你封装 应 ...
- python3 Paramiko模块学习
简介 ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography). 有了Paramiko以后,我们就可以在Py ...
- VLAD算法浅析, BOF、FV比较
划重点 ================================================= BOF.FV.VLAD等算法都是基于特征描述算子的特征编码算法,关于特征描述算子是以SIFT ...
- 微信小程序之页面导航栏
效果图: 页面有点丑,作为初次学习,页面可以要求不那么美观,先学会再说.毕竟后面可以优化的很漂亮. 代码实例如下: <view class="section btn-area" ...
- MySql 三大知识点——索引、锁、事
作者:莫那鲁道原文:http://thinkinjava.cn/2019/03/16/2019-03-16-mysql/ 1. 索引 索引,类似书籍的目录,可以根据目录的某个页码立即找到对应的内容. ...
- ora-8176原因及解决方法
在oracle undo_retention范围内,且_undo_autotune=false的情况下,一个语句执行的时候仍然发生ora-8176,语句如下: INSERT INTO XXX SELE ...
- (3)PyCharm中Flask工程逆向生成数据库表
一.创建数据库 在mysql数据库中创建名为"movie"的数据库. 二.安装SQLAlchemy 三.安装PyMySQL 四.创建数据模型 在app/models.py中编写数据 ...
- 数据分析入门——pandas数据处理
1,处理重复数据 使用duplicated检测重复的行,返回一个series,如果不是第一次出现,也就是有重复行的时候,则为True: 对应的,可以使用drop_duplicates来删除重复的行: ...
- Ehcache API的使用和注意点
目录 创建CacheManager CacheManager常用的API 创建Cache Cache常用的API 创建Element Element常用的API 配置文件 配置文件名为ehcache. ...
- [LeetCode] 401. Binary Watch 二进制表
A binary watch has 4 LEDs on the top which represent the hours (0-11), and the 6 LEDs on the bottom ...