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 ...
随机推荐
- DEA Push rejected: Push to origin/master was rejected问题的解决方法
打开需要上传文件所在的文件夹 使用git bash git pull origin master –allow-unrelated-histories git push -u origin maste ...
- avalon $computed不起作用?
computed写的个数,应该是只能一个的,之前写了两个,一个是空,一个里面有数据,那个有数据的不起作用,但是在有数据的里面写一个一个console.log就会起作用,所以将多余的空的computed ...
- 解决Shell脚本$'\r': command not found问题
造成这个问题的原因是Windows下的空行,我们只需要把文件转成unix就好 Centos下,执行yum install dos2unix,然后dos2unix [file],再执行shell命令就好 ...
- Healthcare in Azure
- 第06组 Alpha冲刺(4/4)
队名:福大帮 组长博客链接:https://www.cnblogs.com/mhq-mhq/p/11913386.html 作业博客 :https://edu.cnblogs.com/campus/f ...
- Netty Socket编程
工程结构图 一.Socket服务端 1.创建MyServer 类 public class MyServer { public static void main(String[] args) thro ...
- ERROR: relation "pg_buffercache" does not exist
创建pg_buffercache后,查询时报错: postgres=# create extension pg_buffercache; postgres=# select * from pg_buf ...
- docker 部署jar包
docker volume create j1ls /var/lib/docker/volumes/j1/_data 上传jardocker run -it -d --name j1 -v j1:/h ...
- Python3基础 函数 函数名作为参数传给函数
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- android RelativeLayout实现左中右布局
RelativeLayout实现左中右布局 <RelativeLayout android:layout_width="match_parent" android:lay ...