當前位置:編程學習大全網 - 源碼下載 - 簡述壹下Java中的web容器,舉幾個例子也行

簡述壹下Java中的web容器,舉幾個例子也行

目前市場上常用的開源Java Web容器有Tomcat、Resin和Jetty。其中Resin從V3.0後需要購買才能用於商業目的,而其他兩種則是純開源的。可以分別從他們的網站上下載最新的二進制包和源代碼。

作為Web容器,需要承受較高的訪問量,能夠同時響應不同用戶的請求,能夠在惡劣環境下保持較高的穩定性和健壯性。在HTTP服務器領域,Apache HTTPD的效率是最高的,也是最為穩定的,但它只能處理靜態頁面的請求,如果需要支持動態頁面請求,則必須安裝相應的插件,比如mod_perl可以處理Perl腳本,mod_python可以處理Python腳本。

上面介紹的三中Web容器,都是使用Java編寫的HTTP服務器,當然他們都可以嵌到Apache中使用,也可以獨立使用。分析它們處理客戶請求的方法有助於了解Java多線程和線程池的實現方法,為設計強大的多線程服務器打好基礎。

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個)創建空閑線程並放到線程池中。使用時從數組中移走空閑的線程,用完後,再“歸還”給線程池。

  • 上一篇:微信分銷系統與傳統電商有何區別
  • 下一篇:IOCP和線程池是什麽關系?
  • copyright 2024編程學習大全網