浅谈Selector创建机制

引自http://ari.iteye.com/blog/1039014

前段时间阅读mina源码时,理Selector实例化机制细节有点疑惑疑惑,主要是SelectorProvider的细节实现方面。

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

Java代码   收藏代码
  1. Selector selector = Selector.open();  

 

观察JDK源码发现Select的创建通过SelectorProvider辅助类来完成

 

Java代码   收藏代码
  1. public static Selector open() throws IOException {  
  2.     return SelectorProvider.provider().openSelector();  
  3.     }  

 

 

进一步观察SelectorProvider类provider方法源码,引用到类sun.nio.ch.DefaultSelectorProvider,开始的时候由于在JDK API

中没找到该类,源码里面也没找到,比较疑惑如何创建的。今天在rt.jar找到了该类,并找到其对源码。

 

Java代码   收藏代码
  1. /** 
  2.              * Returns the default SelectorProvider. 
  3.              */  
  4.             public static SelectorProvider create() {  
  5.                 PrivilegedAction pa = new GetPropertyAction("os.name");  
  6.                 String osname = (String) AccessController.doPrivileged(pa);  
  7.                 if ("SunOS".equals(osname)) {//1、如果SunOS  
  8.                     return new sun.nio.ch.DevPollSelectorProvider();  
  9.                 }  
  10.                 //2、Linux 内核>=2.6  
  11.                 // use EPollSelectorProvider for Linux kernels >= 2.6  
  12.                 if ("Linux".equals(osname)) {  
  13.                     pa = new GetPropertyAction("os.version");  
  14.                     String osversion = (String) AccessController  
  15.                             .doPrivileged(pa);  
  16.                     String[] vers = osversion.split("\\."0);  
  17.                     if (vers.length >= 2) {  
  18.                         try {  
  19.                             int major = Integer.parseInt(vers[0]);  
  20.                             int minor = Integer.parseInt(vers[1]);  
  21.                             if (major > 2 || (major == 2 && minor >= 6)) {  
  22.                                 return new sun.nio.ch.EPollSelectorProvider();  
  23.                             }  
  24.                         } catch (NumberFormatException x) {  
  25.                             // format not recognized  
  26.                         }  
  27.                     }  
  28.                 }  
  29.                 return new sun.nio.ch.PollSelectorProvider();  
  30.             }  

 

 

create方法根据不同的操作系统构建不同的SelectorProvider,主要分为unix、linux,other,linux针对内核2.6以上

通过epoll。获取系统环境中的os.name、os.version观察下不同平台的细节。

 

Java代码   收藏代码
  1. System.out.println(System.getProperty("os.name"));  
  2. System.out.println(System.getProperty("os.version"));  
  3. System.out.println(java.nio.channels.spi.SelectorProvider.provider());  

 

 通过在不同的操作系统上执行如下代码即可区分:

win XP sp3:

 

 写道
Windows XP
5.1
sun.nio.ch.WindowsSelectorProvider@1fb8ee3

 

 ubuntu 11.04:

 

 写道
Linux
2.6.38-8-generic
sun.nio.ch.EPollSelectorProvider@160c21a

 

JDK对linux内核2.6以上版本默认采用epoll,Linux下性能得到一定幅度提升。

 

 

参考:

DefaultSelectorProvider源码:http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Platform/solaris/sun/nio/ch/DefaultSelectorProvider.java.htm

猜你喜欢

转载自skywhsq1987.iteye.com/blog/1754194
今日推荐