zoukankan      html  css  js  c++  java
  • 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多路复用。

     

  • 相关阅读:
    10.C语言_Switch语句
    9.C语言_运算符和表达式分支语句
    问题是:js是如何实现鼠标移动到不同栏位切换对应的显示内容的?
    初识JavaScript,Ajax,jQuery,并比较三者关系
    使用母板页的内容页中js脚本应该放在什么位置,怎么调用
    如何让图片太大时自动缩小显示?
    网页视频播放器代码大全 + 21个为您的网站和博客提供的免费视频播放器
    flvplayer.swf flv视频播放器使用方法
    FileUpload检查上传文件扩展名,限制大小,创建路径存储
    几种代码生成器的叙述
  • 原文地址:https://www.cnblogs.com/AshOfTime/p/10929577.html
Copyright © 2011-2022 走看看