论坛首页 Java企业应用论坛

Java NIO 选择器(Selector) 知识预备 (linux epoll)

浏览 10475 次
该帖已经被评为精华帖
作者 正文
   发表时间:2011-08-16  
希望LZ详细介绍下edge和level触发所带来的一些好处,以及编码时需要注意的内容把
0 请登录后投票
   发表时间:2011-08-17  
goldendoc 写道
littlecar 写道
楼主想向你请教一个问题。
前段时间看了下java nio selector的java层面的实现(没有深入到native code看cpp代码,且也只是粗略的看),发现一个问题,对于每一个注册了相关事件的socketchannel/serversocketchannel,selector都会为他们开启一个等待线程sun.nio.windowSelectorImpl$selectThread,这让我很迷惑:
selector本名多路复用机制,就是为了在一个通道上完成以前需要多个慢速通道才能完成问题,这种机制的好处也不就是在于避免了 thread per socketchannel而频繁导致thread的阴塞与调度吗?
所以对于openjdk里selectorimp.java,最终每个socketchannel一个thread的模式,能给解释下吗?谢谢。


首先要理解windows下的NIO的Selector其实就是用select实现的,select有MAX_SELECTABLE_FDS限制,而NIO的Selector似乎没有这个限制,为什么,这就是SelectThread的作用,SelectThread中有SubSelector可以用于poll,同时WindowsSelector保证了MAX_SELECTABLE_FDS - 1会拥有一个Daemon的SelectThread线程,去完成select工作,因此不是每个Channel会有一个SelectThread,而是每MAX_SELECTABLE_FDS - 1会有一个SelectThread去做select工作。

的确是,没认真看。当时觉得对每一个socketchannel都生成一个selectthread去poll一下觉得太坑爹了。

顺便赞同下楼上的观点,期待楼主在剖析了源码后,能写一些应用人员nio编程时的注意事项与一些应用技巧。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics