`

浅谈Selector创建机制

    博客分类:
  • java
 
阅读更多

引自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

分享到:
评论

相关推荐

    浅谈android的selector背景选择器

    ### 浅谈Android的Selector背景选择器 #### 一、引言 在Android开发中,为了提高用户体验,经常需要对控件的外观进行定制化处理,特别是在不同的交互状态下展示不同的视觉效果。`Selector`作为Android中一个非常...

    Java NIO——Selector机制解析三(源码分析)

    本文将深入探讨Java NIO中的Selector机制,并通过源码分析来理解其实现原理。 Selector机制是Java NIO中的核心组件,它允许单线程同时监控多个通道(Channels)的状态变化,例如连接就绪、数据可读或可写等。这种...

    Java_NIO类库Selector机制解析.doc

    Java_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.doc

    Java-NIO类库Selector机制解析.docx

    这是因为Selector.open()方法可能会创建一个自己连接自己的TCP/IP链接,导致异常。解决这个问题需要了解Selector.open()方法的内部机制和Java虚拟机对操作系统调用的影响。 八、总结 Java NIO类库提供了高效的I/O...

    Android绘图机制Selector

    例如,我们可以创建一个通用的边框Selector,然后在其他Selector中通过include标签引用: ```xml <!-- 边框Selector --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> ... ... ...

    Android selector 完整demo

    总的来说,Android的Selector机制提供了一种灵活的方式,让我们可以根据视图的状态改变其外观。通过熟练掌握Selector,你可以创建出更加丰富和动态的用户界面。在实际开发中,Selector常用于按钮、列表项以及其他可...

    JavaNIO库Selector机制解析.docx

    JavaNIO库Selector机制解析.docx

    Android设置button背景selector和字体selector

    在布局文件中,我们将上述创建的Selector分别设置给Button的`android:background`和`android:textColor`属性。例如: ```xml android:id="@+id/my_button" android:layout_width="wrap_content" android:...

    android selector注入器

    在Android开发中,选择器(Selector)是一种非常重要的机制,用于定义View在不同状态下的显示样式,如按下、聚焦、默认等。`android selector注入器` 提供了一种高效且便捷的方式来管理这些状态选择器,使得开发者...

    java selector 测试并发

    这种机制极大地提高了处理并发连接的效率,尤其在服务器端编程中,如构建高并发的网络应用。 Java Selector的核心类包括`Selector`、`SelectionKey`和`SelectableChannel`。`Selector`是实际进行选择操作的对象,它...

    flutter file-selector

    Flutter的file_selector插件可以帮助开发者在移动应用中方便地选择文件。 要使用file_selector插件,首先需要将插件的依赖项添加到pubspec.yaml文件中,并运行flutter pub get命令获取插件的最新版本。 在插件使用...

    java selector类的用法举例

    为了更好地理解`Selector`的工作机制,我们可以将其类比为一个学校的情景: 1. **学校(ServerSocketChannel)**:代表我们的网络应用程序。一旦启动,学校将不停止运行,直到学期结束。 2. **学校教务处(Selector...

    iconFont 实现selector的Demo

    1. **创建selector文件**:在res/drawable目录下创建一个XML文件,如`icon_selector.xml`,并定义不同状态下的图标样式。 2. **定义状态**:在selector文件中,使用`<item>`标签定义图标在不同状态(如`android:...

    java nio Selector的使用-客户端

    在创建Selector时,可以使用`java.nio.channels.Selector.open()`方法。接着,我们可以使用`channel.configureBlocking(false)`将通道设置为非阻塞模式,然后调用`channel.register(selector, interestOps)`方法将...

    带圆角的selector

    5. **应用到控件**:创建好圆角`Selector`后,将其设置为控件的背景即可。例如,对于一个`Button`,可以在布局XML文件中使用`android:background="@drawable/your_selector"`来应用自定义的`Selector`。 6. **代码...

    用selector设置button可用和不可用的样式

    1. 创建Selector资源文件: 首先,在`res/drawable`目录下创建一个XML文件,例如命名为`button_selector.xml`。在这个文件中,我们将定义不同状态下Button的样式。 ```xml <selector xmlns:android=...

    Selector

    标题中的"Selector"一词在IT领域通常指的是选择器,它是编程语言或样式表中用于选取元素的关键概念。在Web开发中,特别是CSS(层叠样式表)中,选择器用于定位HTML或XML文档中的特定元素,以便应用样式。同时,选择...

    Java_NIO-Selector.rar_java nio_selector

    - **创建Selector**:首先,我们需要通过`java.nio.Selector.open()`方法创建一个Selector实例。 - **注册Channel**:然后,我们可以将ServerSocketChannel、SocketChannel或其他类型的通道注册到Selector上,指定...

    Android selector

    通过查看该项目的源代码,开发者可以更深入地了解Selector的用法和实现细节,例如如何创建自定义的Selector,如何动态改变Selector状态等。对于初学者来说,这是一个很好的学习资源,可以帮助他们理解并熟练运用...

    ListView Button ImageView 里应用selector选择器切换图片并保持住

    可以创建一个名为`list_item_selector.xml`的selector资源,然后在ListView的Adapter中设置给每个View。例如: ```xml <selector xmlns:android="http://schemas.android.com/apk/res/android"> </selector> ...

Global site tag (gtag.js) - Google Analytics