淺談Selector創建機制

          前段時間閱讀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下性能得到一定幅度提升。



          參考:

          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 空白 閱讀(1300) 評論(0)  編輯  收藏


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


          網站導航:
           
          <2011年5月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類(15)

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 浏阳市| 琼中| 额敏县| 尉氏县| 盱眙县| 界首市| 黔西县| 老河口市| 佛教| 邯郸市| 广宁县| 杭锦后旗| 灌阳县| 浠水县| 巴塘县| 海门市| 当阳市| 汝南县| 上虞市| 临江市| 贡山| 九龙城区| 平定县| 特克斯县| 咸阳市| 蓝山县| 邛崃市| 宣城市| 手游| 县级市| 绥中县| 古蔺县| 鄂伦春自治旗| 宁国市| 田林县| 阜城县| 奉节县| 上饶县| 镇坪县| 彰化县| 霍城县|