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的更多相关文章

  1. Java NIO类库Selector机制解析(下)

    五.  迷惑不解 : 为什么要自己消耗资源? 令人不解的是为什么我们的Java的New I/O要设计成这个样子?如果说老的I/O不能多路复用,如下图所示,要开N多的线程去挨个侦听每一个Channel ...

  2. Java NIO类库Selector机制解析(上)

    一.  前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但引入了全新的高效的I/O机制,同时,也引入了多路复用的异步模式.NIO的包中主要包含了这样几种抽象数据类型: ...

  3. NIO的Selector

    参考自 Java NIO系列教程(六) Selector Java-NIO-Selector java.nio.channels.Selector NIO新功能Top 10(下) 出发点: 如何管理多 ...

  4. Java NIO 选择器(Selector)的内部实现(poll epoll)

    http://blog.csdn.net/hsuxu/article/details/9876983 之前强调这么多关于linux内核的poll及epoll,无非是想让大家先有个认识: Java NI ...

  5. NIO组件Selector调用实例

    *对于nio的非阻塞I/O操作,使用Selector获取哪些I/O准备就绪,注册的SelectionKey集合记录关联的Channel这些信息.SelectionKey记录Channel对buffer ...

  6. NIO组件Selector工作机制详解(上)

    转自:http://blog.csdn.net/haoel/article/details/2224055 一.  前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但 ...

  7. Java NIO类库Selector机制解析--转

    一.  前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但引入了全新的高效的I/O机制,同时,也引入了多路复用的异步模式.NIO的包中主要包含了这样几种抽象数据类型: ...

  8. Java NIO之Selector(选择器)

    历史回顾: Java NIO 概览 Java NIO 之 Buffer(缓冲区) Java NIO 之 Channel(通道) 其他高赞文章: 面试中关于Redis的问题看这篇就够了 一文轻松搞懂re ...

  9. Nio使用Selector客户端与服务器的通信

    使用NIO的一个最大优势就是客户端于服务器自己的不再是阻塞式的,也就意味着服务器无需通过为每个客户端的链接而开启一个线程.而是通过一个叫Selector的轮循器来不断的检测那个Channel有消息处理 ...

  10. Java NIO 选择器(Selector)的内部实现(poll epoll)(转)

    转自:http://blog.csdn.net/hsuxu/article/details/9876983 之前强调这么多关于linux内核的poll及epoll,无非是想让大家先有个认识: Java ...

随机推荐

  1. DEA Push rejected: Push to origin/master was rejected问题的解决方法

    打开需要上传文件所在的文件夹 使用git bash git pull origin master –allow-unrelated-histories git push -u origin maste ...

  2. avalon $computed不起作用?

    computed写的个数,应该是只能一个的,之前写了两个,一个是空,一个里面有数据,那个有数据的不起作用,但是在有数据的里面写一个一个console.log就会起作用,所以将多余的空的computed ...

  3. 解决Shell脚本$'\r': command not found问题

    造成这个问题的原因是Windows下的空行,我们只需要把文件转成unix就好 Centos下,执行yum install dos2unix,然后dos2unix [file],再执行shell命令就好 ...

  4. Healthcare in Azure

  5. 第06组 Alpha冲刺(4/4)

    队名:福大帮 组长博客链接:https://www.cnblogs.com/mhq-mhq/p/11913386.html 作业博客 :https://edu.cnblogs.com/campus/f ...

  6. Netty Socket编程

    工程结构图 一.Socket服务端 1.创建MyServer 类 public class MyServer { public static void main(String[] args) thro ...

  7. ERROR: relation "pg_buffercache" does not exist

    创建pg_buffercache后,查询时报错: postgres=# create extension pg_buffercache; postgres=# select * from pg_buf ...

  8. docker 部署jar包

    docker volume create j1ls /var/lib/docker/volumes/j1/_data 上传jardocker run -it -d --name j1 -v j1:/h ...

  9. Python3基础 函数 函数名作为参数传给函数

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  10. android RelativeLayout实现左中右布局

    RelativeLayout实现左中右布局   <RelativeLayout android:layout_width="match_parent" android:lay ...