淺談Selector創(chuàng)建機制

          前段時間閱讀mina源碼時,理Selector實例化機制細節(jié)有點疑惑疑惑,主要是SelectorProvider的細節(jié)實現(xiàn)方面。

          通常創(chuàng)建一個Selector,通過靜態(tài)open方法創(chuàng)建一個實例。代碼如下:

          Selector selector = Selector.open();


          觀察JDK源碼發(fā)現(xiàn)Select的創(chuàng)建通過SelectorProvider輔助類來完成


          public static Selector open() throws IOException {
          return SelectorProvider.provider().openSelector();
          }



          進一步觀察SelectorProvider類provider方法源碼,引用到類sun.nio.ch.DefaultSelectorProvider,開始的時候由于在JDK API

          中沒找到該類,源碼里面也沒找到,比較疑惑如何創(chuàng)建的。今天在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 內(nèi)核>=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方法根據(jù)不同的操作系統(tǒng)構(gòu)建不同的SelectorProvider,主要分為unix、linux,other,linux針對內(nèi)核2.6以上

          通過epoll。獲取系統(tǒng)環(huán)境中的os.name、os.version觀察下不同平臺的細節(jié)。


          System.out.println(System.getProperty("os.name"));
          System.out.println(System.getProperty("os.version"));
          System.out.println(java.nio.channels.spi.SelectorProvider.provider());


           通過在不同的操作系統(tǒng)上執(zhí)行如下代碼即可區(qū)分:

          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內(nèi)核2.6以上版本默認采用epoll,Linux下性能得到一定幅度提升。



          參考:

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

          posted on 2011-05-10 20:53 空白 閱讀(1293) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          <2011年5月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統(tǒng)計

          常用鏈接

          留言簿(1)

          隨筆分類(15)

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 桂东县| 马鞍山市| 汉源县| 孟村| 湖州市| 扬州市| 仙居县| 灵璧县| 南平市| 宁城县| 根河市| 皋兰县| 南乐县| 平潭县| 陇西县| 阳春市| 阿鲁科尔沁旗| 睢宁县| 贵阳市| 通许县| 巨鹿县| 盐池县| 西丰县| 马龙县| 亚东县| 开鲁县| 浮梁县| 北流市| 三原县| 乐亭县| 平舆县| 陆河县| 武陟县| 永城市| 九龙坡区| 西林县| 金溪县| 南皮县| 麻江县| 兖州市| 青阳县|