<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    TOMCAT源碼總結一

    Posted on 2009-08-30 20:05 林光炎 閱讀(1875) 評論(0)  編輯  收藏 所屬分類: JAVA

    首先不得不說這個類org.apache.tomcat.util.net.JIoEndpoint,它負責所有的TCP請求連接,實現了一個服務器模式,啟用一個后臺監聽線程,負責接收到來的socket,然后從線程池中取出響應的worker,扔給worker進行處理,自己繼續監聽。其次worker是一個負責處理socket的一個線程,就是它帶著用戶的請求開始進入Tomcat世界的,默認的worker總共有200個,即:最多200個線程。當處理完一個請求的時候,這個線程并不會銷毀,而是進入wait阻塞,這個線程的對象也不會銷毀,是進入了一個棧里面,對應workstack那個數據結構。每當接收線程拿到一個socket的時候,就先從棧里面拿出一個已有的線程對象,然后就利用該對象的assign方法,將這個socket給它,并調用notify重新喚醒這個worker的處理線程。以后我們做小型服務器的時候,可以借鑒它的實現方式。正在研究多線程的朋友,這個類絕對讓你可以學的透徹!

    相對應的還有一個org.apache.tomcat.util.net.NioEndpoint,這個和前面那個功能差不多,但是用了NIO包里的API,有一個最大的區別就是,接收線程接收一個socket之后,可能會將這個socket先放入緩存池,然后worker從池里面拿socket去處理,比前面那個類看起來功能和性能都會提升很多,不過代碼行有2K多,相當復雜,設計不夠精巧,有興趣可以去研究下。

    org.apache.tomcat.util.buf.MessageBytes:這是一個接近底層的字符串處理類,為什么說是接近底層,是因為socket接收進來的都是字節類型,而java用的是char或者String,這之間的轉換涉及到編碼問題和性能問題,所以凡是socket收進來的信息,全部都用這個類表示,只有當要輸出字符串的時候,才會將里面的字節進行轉換,實現一種延遲加載的懶模式,被Tomcat底層所使用的Request類,就是大量使用了這個類來存放數據。我們來小小窺視一下,Request類:

    1. private MessageBytes methodMB = MessageBytes.newInstance();
    2.     private MessageBytes unparsedURIMB = MessageBytes.newInstance();
    3.     private MessageBytes uriMB = MessageBytes.newInstance();
    4.     private MessageBytes decodedUriMB = MessageBytes.newInstance();
    5.     private MessageBytes queryMB = MessageBytes.newInstance();
    6.     private MessageBytes protoMB = MessageBytes.newInstance();
    7.  
    8.     // remote address/host
    9.     private MessageBytes remoteAddrMB = MessageBytes.newInstance();
    10.     private MessageBytes localNameMB = MessageBytes.newInstance();
    11.     private MessageBytes remoteHostMB = MessageBytes.newInstance();
    12.     private MessageBytes localAddrMB = MessageBytes.newInstance();
    13.     
    14.     private MimeHeaders headers = new MimeHeaders();

    或許大家會覺得,構造出這么多的類,性能會高到哪里去,其實不是這樣的,不停的構造和銷毀對象的確會損耗相當的性能,但是一個對象被構造出來,可以重復利用,那就相當完美了,這個類就是如此的設計,其中有一個回收資源的方法,叫recycle(),這個方法可以清空里面的數組,清空里面的對象,而不會銷毀自己本身,因為使用它的對象,只要調用recycle,以后又可以重復使用了。

    MessageBytes其實內置了2個重要的類,org.apache.tomcat.util.buf.ByteChunk和org.apache.tomcat.util.buf.CharChunk,這2個類帶我們回到了C時代,為什么這么說?因為它簡直就是一個字符串處理類,一些眼熟的算法全部映入眼簾,比如字符轉匹配算法,indexOf,startsWith,判斷字符轉是否相等,查找字符,等等,比之JDK提供的性能更好,功能更強大(這句話說過了,呵呵)

    還有一個實用的值得學習的數據結構是,org.apache.tomcat.util.buf.Ascii,如果知道表驅動的朋友們,一定對這個類很熟悉了,判斷大小寫?判斷是不是英文單詞?判斷是不是空白符?判斷是不是數字,將字節類型轉換為int、long類型,大小寫轉換,等等。這些都是大學計算機課程的課后練習題

    posts - 104, comments - 33, trackbacks - 0, articles - 0

    Copyright © 林光炎

    主站蜘蛛池模板: 亚洲av无码偷拍在线观看| 国产日本亚洲一区二区三区| 特色特黄a毛片高清免费观看| 永久久久免费浮力影院| 亚洲丁香婷婷综合久久| 免费无码黄动漫在线观看| 亚洲av无码无线在线观看 | 欧亚一级毛片免费看| 四虎永久免费地址在线网站| 白白色免费在线视频| 亚洲无码视频在线| 3344在线看片免费| 亚洲美女视频一区| 成人毛片18女人毛片免费96| 麻豆亚洲AV成人无码久久精品| 免费日本黄色网址| 中文永久免费观看网站| 久久亚洲精品无码AV红樱桃| 国产99视频精品免费观看7| 亚洲一久久久久久久久| 亚洲成?Ⅴ人在线观看无码| 大地资源在线资源免费观看| 亚洲第一网站免费视频| 免费看大黄高清网站视频在线| 青青久久精品国产免费看| 国产亚洲av片在线观看播放| 精品国产sm捆绑最大网免费站| 中文字幕在线观看亚洲日韩| 全亚洲最新黄色特级网站 | 亚洲精品无码永久在线观看| 一本一道dvd在线观看免费视频| 亚洲国产精品一区二区第一页 | 亚洲 无码 在线 专区| 91在线免费视频| 亚洲AV一二三区成人影片| 亚洲av无码成人精品区| 精品熟女少妇av免费久久| 亚洲heyzo专区无码综合| 亚洲国产精品无码久久SM| 成年美女黄网站18禁免费| 国产一级黄片儿免费看|