浅谈Selector创建机制

本文详细解析了JDK中Selector的Provider创建机制,包括如何根据操作系统选择合适的SelectorProvider,以及Linux内核版本对性能的影响。通过代码示例展示了在不同操作系统上的差异性构建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载地址:http://ari.iteye.com/blog/1039014

前段时间阅读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 :

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下性能得到一定幅度提升。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值