`
IXHONG
  • 浏览: 438278 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转载】NIO-SelectableChannel

nio 
阅读更多

本文转载自http://shift-alt-ctrl.iteye.com/blog/1841324

 

SelectableChannel("可被选择"通道):抽象类,此类实现了InterruptableChannel接口."可选择"通道,就是noblocking通道,它的实现需要Selector的支持.因此这些Channel取名为"SelectableChannel"是可以理解的.

为 了和Selector(选择器)一起使用,此类的实例必须首先通过register方法进行注册.此方法返回一个表示该通道已向选择器注册的新 SelectionKey对象."注销"选择器绑定时,会释放分配给改通道的所有资源.需要通过selectionKey.cancel方式注销.调用 Channel.close()或者通过interrupt方式中断IO,都将会隐式的导致selectionKey的取消.一个通道只能注册一个 Selector.SelectableChannel在多线程环境中,也是安全的.

 

SelectableChannel 在设计时,是可以处于"阻塞"或"非阻塞"两种模式下(configureBlocking方法设定).在"阻塞"模式下,每个I/O操作完成之前,都会阻塞其他的IO操作(参见 Channels.write/read,read使用readLock,write使用writeLock同步.).

在"非阻塞"模式 下,永远不会阻塞IO操作,其将会使用Selector作为异步支持.即任何write和read将不阻塞,可能会立即返回.新创建的 SeletableChannel总是处于阻塞模式,如果需要使用selector多路复用,那么必须使用非阻塞模式(API级别控制).当向某个Selector注册时,此Channel必须处于noblocking模式,且此后模式不可改变,直到selectionKey销毁.

 

  • public abstract int validOps():获取此通道所支持的操作集合,同一种类型的Channel,将会得到相同的值,此值为 SelectionKey.OP_READ,OP_WRITE,OP_CONNECT,OP_ACCEPT操作的子集...位或运算之后的结果.
  • public abstract boolean isRegistered():检测当前通道是否已经注册了selector..当SelectionKey被注销之后,或者通道关闭后,仍然有可能返回 true.取消注册关系,有一定的延迟,selector的内部机制.稍后介绍.
  • public abstract SelectionKey keyFor(Selector sel): 获取当前通道注册在指定selector上的键.如果没注册,将返回null.
  • public final SelectionKey register(Selector sel,int ops,Object attr):参见AbsrtactSelectableChannel.register,将此通道注册在selector上,并获取相应的选择 键.ops为此通道感兴趣的操作集,attr为选择键中需要携带的"附件"信息.此方法主要目的,就是让channel与Selector建立关系,并让 selector为其支持异步操作.如果此时通道已关闭,则抛出ClosedChannelException.如果向selector提交的ops不是 当前Channel.validOps的子集,将抛出异常.(ops & ~ validOps() != 0,如果为true,则抛出异常);如果当前通道为blocking模式,则抛出IllegalBlockingModeException.如果当前通 道的选择键数组中,已经有和指定的selector的关联的键,则获得此键.每个SelectableChannel实例中,都有一个key[],这数组 结构保持了当前Channel所持有的注册成功的选择键,即每次register到不同的selector上,都有可能会导致key[]新增(如果先前已 经注册过的selector上,不会产生新的selectionKey);如果key[]通过遍历没有发现指定的selector产生的选择键,将会导致 底层生成新的选择键,然后加入到key[]中.当Channel.close()方法执行时,将会导致key[]中的相应selectionKey被 cancel.被cancel的key将会被存在Selector.cancelledKeys这个集合中,此集合将会被Selector内部实时调用, 然后清除,清除cancelKey时,将会释放channel资源以及移除channel中key[]的相应值(赋值为null).此方法内部,经过了同 步锁控制.与其说channel注册在selector上,尚不如说selector注册在channel上(思维要反转: 事实上的实现为Selector.register(channel,opts,attr)).

 

  • channel.register(selector,ops): 注册感兴趣的 事件,底层还是执行了当前channel对应的selectionKey.interstOps(ops);因此register注册的事件,和 selectionKey.interstOps(ops)是等效的,或者可以被修改的.
  • public abstract SelectableChannel configureBlocking(boolean block):配置当前channel的阻塞模式.基于selector的异步IO,必须为false.当前channel处于"非阻塞"模式下,如果改 成block模式时,将会抛出异常.
  • public abstract boolean isBlocking():检测当前通道的阻塞状态.默认直接返回Channel.blocking属性的值.

在AbstractSelectableChannel中有对部分方法实现,上述介绍均摘自它.不过不同的channel子类对部分方法的实现各不相同.稍后具体介绍.

AbstactSelectableChannel 中有2个同步锁:Object regLock和Object keyLock...regLock用于同步register()/configureBlocking()两种操作.keyLock用户同步 register()/close()/以及cancelKeys的移除.

0
1
分享到:
评论

相关推荐

    httpcore-nio-4.4.6-API文档-中文版.zip

    赠送jar包:httpcore-nio-4.4.6.jar 赠送原API文档:httpcore-nio-4.4.6-javadoc.jar 赠送源代码:httpcore-nio-4.4.6-sources.jar 包含翻译后的API文档:httpcore-nio-4.4.6-javadoc-API文档-中文(简体)版.zip ...

    xnio-nio-3.8.0.Final-API文档-中文版.zip

    赠送jar包:xnio-nio-3.8.0.Final.jar; 赠送原API文档:xnio-nio-3.8.0.Final-javadoc.jar; 赠送源代码:xnio-nio-3.8.0.Final-sources.jar; 赠送Maven依赖信息文件:xnio-nio-3.8.0.Final.pom; 包含翻译后的API...

    httpcore-nio-4.4.15-API文档-中文版.zip

    赠送jar包:httpcore-nio-4.4.15.jar 赠送原API文档:httpcore-nio-4.4.15-javadoc.jar 赠送源代码:httpcore-nio-4.4.15-sources.jar 包含翻译后的API文档:httpcore-nio-4.4.15-javadoc-API文档-中文(简体)版....

    httpcore-nio-4.4.10-API文档-中文版.zip

    赠送jar包:httpcore-nio-4.4.10.jar; 赠送原API文档:httpcore-nio-4.4.10-javadoc.jar; 赠送源代码:httpcore-nio-4.4.10-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.10.pom; 包含翻译后的API文档...

    httpcore-nio-4.4.10-API文档-中英对照版.zip

    赠送jar包:httpcore-nio-4.4.10.jar; 赠送原API文档:httpcore-nio-4.4.10-javadoc.jar; 赠送源代码:httpcore-nio-4.4.10-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.10.pom; 包含翻译后的API文档...

    httpcore-nio-4.4.15-API文档-中英对照版.zip

    赠送jar包:httpcore-nio-4.4.15.jar 赠送原API文档:httpcore-nio-4.4.15-javadoc.jar 赠送源代码:httpcore-nio-4.4.15-sources.jar 包含翻译后的API文档:httpcore-nio-4.4.15-javadoc-API文档-中文(简体)-...

    xnio-nio-3.8.4.Final-API文档-中英对照版.zip

    赠送jar包:xnio-nio-3.8.4.Final.jar; 赠送原API文档:xnio-nio-3.8.4.Final-javadoc.jar; 赠送源代码:xnio-nio-3.8.4.Final-sources.jar; 赠送Maven依赖信息文件:xnio-nio-3.8.4.Final.pom; 包含翻译后的API...

    xnio-nio-3.8.0.Final-API文档-中英对照版.zip

    赠送jar包:xnio-nio-3.8.0.Final.jar; 赠送原API文档:xnio-nio-3.8.0.Final-javadoc.jar; 赠送源代码:xnio-nio-3.8.0.Final-sources.jar; 赠送Maven依赖信息文件:xnio-nio-3.8.0.Final.pom; 包含翻译后的API...

    httpcore-nio-4.4.5-API文档-中文版.zip

    赠送jar包:httpcore-nio-4.4.5.jar; 赠送原API文档:httpcore-nio-4.4.5-javadoc.jar; 赠送源代码:httpcore-nio-4.4.5-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.5.pom; 包含翻译后的API文档:...

    nio-multipart-parser-1.1.0.jar

    java运行依赖jar包

    httpcore-nio-4.4.14-API文档-中文版.zip

    赠送jar包:httpcore-nio-4.4.14.jar; 赠送原API文档:httpcore-nio-4.4.14-javadoc.jar; 赠送源代码:httpcore-nio-4.4.14-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.14.pom; 包含翻译后的API文档...

    httpcore-nio-4.4.6-API文档-中英对照版.zip

    赠送jar包:httpcore-nio-4.4.6.jar; 赠送原API文档:httpcore-nio-4.4.6-javadoc.jar; 赠送源代码:httpcore-nio-4.4.6-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.6.pom; 包含翻译后的API文档:...

    httpcore-nio-4.4.12-API文档-中文版.zip

    赠送jar包:httpcore-nio-4.4.12.jar; 赠送原API文档:httpcore-nio-4.4.12-javadoc.jar; 赠送源代码:httpcore-nio-4.4.12-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.12.pom; 包含翻译后的API文档...

    xnio-nio-3.8.4.Final-API文档-中文版.zip

    赠送jar包:xnio-nio-3.8.4.Final.jar; 赠送原API文档:xnio-nio-3.8.4.Final-javadoc.jar; 赠送源代码:xnio-nio-3.8.4.Final-sources.jar; 赠送Maven依赖信息文件:xnio-nio-3.8.4.Final.pom; 包含翻译后的API...

    httpcore-nio-4.3.jar包

    用Java实现非阻塞通信 ,用ServerSocket和Socket来编写服务器程序和客户程序,是Java网络编程的最基本的方式。 httpcore-nio-4.3.jar包

    httpcore-nio-4.4.4-API文档-中文版.zip

    赠送jar包:httpcore-nio-4.4.4.jar; 赠送原API文档:httpcore-nio-4.4.4-javadoc.jar; 赠送源代码:httpcore-nio-4.4.4-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.4.pom; 包含翻译后的API文档:...

    httpcore-nio-4.4.12-API文档-中英对照版.zip

    赠送jar包:httpcore-nio-4.4.12.jar; 赠送原API文档:httpcore-nio-4.4.12-javadoc.jar; 赠送源代码:httpcore-nio-4.4.12-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.12.pom; 包含翻译后的API文档...

    httpcore-nio-4.4.4-API文档-中英对照版.zip

    赠送jar包:httpcore-nio-4.4.4.jar; 赠送原API文档:httpcore-nio-4.4.4-javadoc.jar; 赠送源代码:httpcore-nio-4.4.4-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.4.pom; 包含翻译后的API文档:...

    httpcore-nio-4.4.5-API文档-中英对照版.zip

    赠送jar包:httpcore-nio-4.4.5.jar; 赠送原API文档:httpcore-nio-4.4.5-javadoc.jar; 赠送源代码:httpcore-nio-4.4.5-sources.jar; 赠送Maven依赖信息文件:httpcore-nio-4.4.5.pom; 包含翻译后的API文档:...

    httpcore-nio-4.0.1.jar

    httpcore-nio-4.0.1.jar

Global site tag (gtag.js) - Google Analytics