六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 70|回复: 0

浅谈Selector创建机制

[复制链接]

升级  24%

20

主题

20

主题

20

主题

秀才

Rank: 2

积分
86
 楼主| 发表于 2013-1-15 01:59:29 | 显示全部楼层 |阅读模式
前段时间阅读mina源码时,理解Selector实例化机制细节有点疑惑疑惑,主要是SelectorProvider的细节实现方面。

通常创建一个Selector,通过静态open方法创建一个实例。代码如下:

Selector selector = Selector.open(); 
观察JDK源码发现Select的创建通过SelectorProvider辅助类来完成:
 
public static Selector open() throws IOException {return SelectorProvider.provider().openSelector();    } 
 
进一步观察SelectorProvider类provider方法源码,引用到类sun.nio.ch.DefaultSelectorProvider,开始的时候由于在JDK API
中没找到该类,源码里面也没找到,比较疑惑如何创建的。今天在rt.jar找到了该类,并找到其对源码。
 
/**             * Returns the default SelectorProvider.             */            public static SelectorProvider create() {                PrivilegedAction pa = new GetPropertyAction("os.name");                String osname = (String) AccessController.doPrivileged(pa);                if ("SunOS".equals(osname)) {//1、如果SunOS                    return new sun.nio.ch.DevPollSelectorProvider();                }                //2、Linux 内核>=2.6                // use EPollSelectorProvider for Linux kernels >= 2.6                if ("Linux".equals(osname)) {                    pa = new GetPropertyAction("os.version");                    String osversion = (String) AccessController                            .doPrivileged(pa);                    String[] vers = osversion.split("\\.", 0);                    if (vers.length >= 2) {                        try {                            int major = Integer.parseInt(vers[0]);                            int minor = Integer.parseInt(vers[1]);                            if (major > 2 || (major == 2 && minor >= 6)) {                                return new sun.nio.ch.EPollSelectorProvider();                            }                        } catch (NumberFormatException x) {                            // format not recognized                        }                    }                }                return new sun.nio.ch.PollSelectorProvider();            } 
 
其create方法根据不同的操作系统构建不同的SelectorProvider,主要分为unix、linux,other,linux针对内核2.6以上
通过epoll。获取系统环境中的os.name、os.version观察下不同平台的细节。
 
System.out.println(System.getProperty("os.name"));System.out.println(System.getProperty("os.version"));System.out.println(java.nio.channels.spi.SelectorProvider.provider()); 
 通过在不同的操作系统上执行如下代码即可区分:
win XP sp3:
 
<div class="quote_title"> 写道
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表