隨筆 - 0, 文章 - 264, 評論 - 170, 引用 - 0
          數據加載中……

          Tomcat線程池apr和threadPool(注:轉載于http://hi.baidu.com/%CE%E2_%F0%A9/blog/item/da3a56441965cb3386947350.html)

          Tomcat是使用最廣的Java Web容器,功能強大,可擴展性強。最新版本的Tomcat(5.5.17)為了提高響應速度和效率,使用了Apache Portable Runtime(APR)作為最底層,使用了APR中包含Socket、緩沖池等多種技術,性能也提高了。APR也是Apache HTTPD的最底層。可想而知,同屬于ASF(Apache Software Foundation)中的成員,互補互用的情況還是很多的,雖然使用了不同的開發語言。

          Tomcat 的線程池位于tomcat-util.jar文件中,包含了兩種線程池方案。

          方案一:使用APR的Pool技術,使用了JNI;

          方案二:使用Java實現的ThreadPool。這里介紹的是第二種。如果想了解APR的Pool技術,可以查看APR的源代碼。

          ThreadPool默認創建了5個線程,保存在一個200維的線程數組中,創建時就啟動了這些線程,當然在沒有請求時,它們都處理“等待”狀態(其實就是一個while循環,不停的等待notify)。如果有請求時,空閑線程會被喚醒執行用戶的請求。

          具體的請求過程是: 服務啟動時,創建一個一維線程數組(maxThread=200個),并創建空閑線程(minSpareThreads=5個)隨時等待用戶請求。 當有用戶請求時,調用 threadpool.runIt(ThreadPoolRunnable)方法,將一個需要執行的實例傳給ThreadPool中。其中用戶需要執行的 實例必須實現ThreadPoolRunnable接口。 ThreadPool 首先查找空閑的線程,如果有則用它運行要執行ThreadPoolRunnable;如果沒有空閑線程并且沒有超過maxThreads,就一次性創建 minSpareThreads個空閑線程;如果已經超過了maxThreads了,就等待空閑線程了。總之,要找到空閑的線程,以便用它執行實例。找到 后,將該線程從線程數組中移走。 接著喚醒已經找到的空閑線程,用它運行執行實例(ThreadPoolRunnable)。 運行完ThreadPoolRunnable后,就將該線程重新放到線程數組中,作為空閑線程供后續使用。

          由此可以看出,Tomcat的線程池實現是比較簡單的,ThreadPool.java也只有840行代碼。用一個一維數組保存空閑的線程,每次以一個較小步伐(5個)創建空閑線程并放到線程池中。使用時從數組中移走空閑的線程,用完后,再“歸還”給線程池

          tomcat5.5.10以上版本支持apr,支持通過apache runtime module進行JNI調用,使用本地代碼來加速網絡處理。

          如果不使用apr之前,Tomcat的Servlet線程池使用的是阻塞IO的模式,使用apr之后,線程池變成了 NIO的非阻塞模式,而且這種NIO還是使用了操作系統的本地代碼,看tomcat文檔上面的說法是,極大提升web處理能力,不再需要專門放一個web server處理靜態頁面了。
          我自己直觀的感受是,不用apr之前,你配置多少個等待線程,tomcat就會啟動多少個線程掛起等待,使用apr以后,不管你配置多少,就只有幾個NIO調度的線程,這一點你可以通過kill -3 PID,然后察看log得知。

          假設不使用apr,可能端口的線程調度能力比較差,所以通過iptables進行端口轉發,讓兩個端口去分擔一個端口的線程調度,就有可能減少線程調度的并發,從而提高處理能力,減少資源消耗。

          posted on 2010-08-29 14:15 小一敗涂地 閱讀(4080) 評論(1)  編輯  收藏 所屬分類: tomcat、apache、jboss等服務器相關

          評論

          # re: Tomcat線程池apr和threadPool(注:轉載于http://hi.baidu.com/%CE%E2_%F0%A9/blog/item/da3a56441965cb3386947350.html)  回復  更多評論   

          頁面變形了,內容有點亂,看著挺費勁。
          2012-10-26 17:15 | 郭冬樂
          主站蜘蛛池模板: 祁门县| 大竹县| 阿克苏市| 鱼台县| 色达县| 永清县| 五莲县| 巴青县| 太湖县| 上饶市| 瑞金市| 宜黄县| 丽水市| 莱州市| 青浦区| 高阳县| 柳河县| 通化县| 常山县| 股票| 隆昌县| 隆安县| 武城县| 东光县| 罗定市| 四会市| 马鞍山市| 府谷县| 安福县| 嘉义市| 杨浦区| 开阳县| 五峰| 资兴市| 库车县| 宁武县| 新泰市| 竹山县| 新密市| 嘉祥县| 威海市|