- 浏览: 246111 次
-
文章分类
最新评论
引自http://ari.iteye.com/blog/1039014
前段时间阅读mina源码时,理解Selector实例化机制细节有点疑惑疑惑,主要是SelectorProvider的细节实现方面。
通常创建一个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:
写道
Windows XP
5.1
sun.nio.ch.WindowsSelectorProvider@1fb8ee3
5.1
sun.nio.ch.WindowsSelectorProvider@1fb8ee3
ubuntu 11.04:
写道
Linux
2.6.38-8-generic
sun.nio.ch.EPollSelectorProvider@160c21a
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
发表评论
-
mac svn版本
2014-11-14 15:21 870http://xiayong.blog.51cto.com ... -
lucene索引结构比较好得博客
2014-11-03 21:16 648http://www.cnblogs.com/forfutur ... -
lucene再64位系统上使用MMapDirectory
2014-11-03 20:18 2106引子http://www.cnblogs.com/huang ... -
mvn发布单个文件
2014-10-31 15:38 649由于平时我们开发都是一个大项目中包含几个子项目,需要depl ... -
使用 ObjectOutputStream 可能引起的内存泄漏
2014-10-30 17:14 1469场景,线上堆栈10G,平时内存使用达到8个G而 ... -
CMS GC时出现promotion failed和concurrent mode failure
2014-10-29 23:44 839对于采用CMS进行旧生代GC的程序而言,尤其要注意GC日志中 ... -
jboss发布war
2014-10-23 13:09 744http://www.blogjava.net/hello-y ... -
netty学习blog
2014-10-09 16:04 628http://www.infoq.com/cn/article ... -
java多线程
2014-10-08 13:37 617http://www.cnblogs.com/skywang1 ... -
volatile和重排序得一些小疑问
2014-09-24 15:38 1628http://yeziwang.iteye.com/blog ... -
内存映射文件
2014-09-19 11:09 731简介: 内存映射文件与虚拟内存有些类 ... -
心跳机制 heartbeat
2014-08-05 23:13 1815心跳机制可以分为集中式和分散式,简单说集中式 ... -
一个性能瓶颈分析的过程
2014-07-29 16:19 541引自http://blog.csdn.net/axm ... -
zip gzip
2014-07-29 15:09 608http://www.differencebetween. ... -
mvn expected: CRLF
2014-07-03 14:36 781Checkstyle error is not severe ... -
git远程分支更新
2013-10-09 16:44 886git remote prune origin清理掉远程不存 ... -
关于synchronized一个字符串的问题
2013-07-25 11:12 6295在memcached中我们公司首先根据查询条件获得key,然 ... -
php树型无限级分类结构[预排序遍历树算法]
2013-07-22 18:22 885预排序遍历树算法 modi ... -
linux下打开class文件
2013-03-04 20:22 2444linux下打开class文件 hexdump -C *.cl ... -
对象分配规则
2013-02-27 14:03 860对象分配规则 1.对象优先分配在Eden区,如果Eden区 ...
相关推荐
### 浅谈Android的Selector背景选择器 #### 一、引言 在Android开发中,为了提高用户体验,经常需要对控件的外观进行定制化处理,特别是在不同的交互状态下展示不同的视觉效果。`Selector`作为Android中一个非常...
本文将深入探讨Java NIO中的Selector机制,并通过源码分析来理解其实现原理。 Selector机制是Java NIO中的核心组件,它允许单线程同时监控多个通道(Channels)的状态变化,例如连接就绪、数据可读或可写等。这种...
Java_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.doc
这是因为Selector.open()方法可能会创建一个自己连接自己的TCP/IP链接,导致异常。解决这个问题需要了解Selector.open()方法的内部机制和Java虚拟机对操作系统调用的影响。 八、总结 Java NIO类库提供了高效的I/O...
例如,我们可以创建一个通用的边框Selector,然后在其他Selector中通过include标签引用: ```xml <!-- 边框Selector --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> ... ... ...
总的来说,Android的Selector机制提供了一种灵活的方式,让我们可以根据视图的状态改变其外观。通过熟练掌握Selector,你可以创建出更加丰富和动态的用户界面。在实际开发中,Selector常用于按钮、列表项以及其他可...
JavaNIO库Selector机制解析.docx
在布局文件中,我们将上述创建的Selector分别设置给Button的`android:background`和`android:textColor`属性。例如: ```xml android:id="@+id/my_button" android:layout_width="wrap_content" android:...
在Android开发中,选择器(Selector)是一种非常重要的机制,用于定义View在不同状态下的显示样式,如按下、聚焦、默认等。`android selector注入器` 提供了一种高效且便捷的方式来管理这些状态选择器,使得开发者...
这种机制极大地提高了处理并发连接的效率,尤其在服务器端编程中,如构建高并发的网络应用。 Java Selector的核心类包括`Selector`、`SelectionKey`和`SelectableChannel`。`Selector`是实际进行选择操作的对象,它...
Flutter的file_selector插件可以帮助开发者在移动应用中方便地选择文件。 要使用file_selector插件,首先需要将插件的依赖项添加到pubspec.yaml文件中,并运行flutter pub get命令获取插件的最新版本。 在插件使用...
为了更好地理解`Selector`的工作机制,我们可以将其类比为一个学校的情景: 1. **学校(ServerSocketChannel)**:代表我们的网络应用程序。一旦启动,学校将不停止运行,直到学期结束。 2. **学校教务处(Selector...
1. **创建selector文件**:在res/drawable目录下创建一个XML文件,如`icon_selector.xml`,并定义不同状态下的图标样式。 2. **定义状态**:在selector文件中,使用`<item>`标签定义图标在不同状态(如`android:...
在创建Selector时,可以使用`java.nio.channels.Selector.open()`方法。接着,我们可以使用`channel.configureBlocking(false)`将通道设置为非阻塞模式,然后调用`channel.register(selector, interestOps)`方法将...
5. **应用到控件**:创建好圆角`Selector`后,将其设置为控件的背景即可。例如,对于一个`Button`,可以在布局XML文件中使用`android:background="@drawable/your_selector"`来应用自定义的`Selector`。 6. **代码...
1. 创建Selector资源文件: 首先,在`res/drawable`目录下创建一个XML文件,例如命名为`button_selector.xml`。在这个文件中,我们将定义不同状态下Button的样式。 ```xml <selector xmlns:android=...
标题中的"Selector"一词在IT领域通常指的是选择器,它是编程语言或样式表中用于选取元素的关键概念。在Web开发中,特别是CSS(层叠样式表)中,选择器用于定位HTML或XML文档中的特定元素,以便应用样式。同时,选择...
- **创建Selector**:首先,我们需要通过`java.nio.Selector.open()`方法创建一个Selector实例。 - **注册Channel**:然后,我们可以将ServerSocketChannel、SocketChannel或其他类型的通道注册到Selector上,指定...
通过查看该项目的源代码,开发者可以更深入地了解Selector的用法和实现细节,例如如何创建自定义的Selector,如何动态改变Selector状态等。对于初学者来说,这是一个很好的学习资源,可以帮助他们理解并熟练运用...
可以创建一个名为`list_item_selector.xml`的selector资源,然后在ListView的Adapter中设置给每个View。例如: ```xml <selector xmlns:android="http://schemas.android.com/apk/res/android"> </selector> ...