博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NIO(3)--Selector
阅读量:5249 次
发布时间:2019-06-14

本文共 1533 字,大约阅读时间需要 5 分钟。

  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多路复用。

 

转载于:https://www.cnblogs.com/AshOfTime/p/10929577.html

你可能感兴趣的文章
GridView使用CommandField删除列实现删除时提示确认框
查看>>
uvalive3983Robtruck
查看>>
ES6相关新特性介绍
查看>>
C#让程序以管理员身份运行程序
查看>>
35-外部世界如何访问容器?
查看>>
poj 2406 Power Srings (kmp循环节) (经典)
查看>>
ANDROID开发文档翻译
查看>>
[转载]void及void*的深度剖析
查看>>
MongoDB - Introduction of the mongo Shell
查看>>
rf-kill
查看>>
ubuntu16.04中设置python3
查看>>
算法(3)Rotate Array
查看>>
PHP一维数组转二维数组正则表达式
查看>>
第二章课后习题2-3
查看>>
phpstudy 2016 切换Nginx+php7.0版本所需运行库 vc14 + 安装redis拓展
查看>>
2018-12-18 随笔
查看>>
objective-c(Copy):
查看>>
winform 用子窗体刷新父窗体,子窗体改变父窗体控件的值
查看>>
python中循环引用导致内存泄漏小案例
查看>>
VSTO向Excel单元格写入Date类型
查看>>