[並發]線程池技術小白
1 線程池技術介紹
在麵向對象編程中,創建和銷毀對象是很費時間的,因為創建一個對象要獲取內存資源或者其它更多資源。在Java中更是如此,虛擬機將試圖跟蹤每一個對象,以便能夠在對象銷毀後進行垃圾回收。所以提高服務程序效率的一個手段就是盡可能減少創建和銷毀對象的次數,特別是一些很耗資源的對象創建和銷毀。如何利用已有對象來服務就是一個需要解決的關鍵問題,其實這就是一些"池化資源"技術產生的原因。比如大家所熟悉的數據庫連接池正是遵循這一思想而產生的,本文將介紹的線程池技術同樣符合這一思想。
諸如Web服務器、數據庫服務器、文件服務器和郵件服務器等許多服務器應用程序都需要處理一種常見的情況:單個任務處理的時間很短而請求的數目卻是巨大的。假設我們構建一個簡單服務器應用程序模型:每當一個請求到達就創建一個新的服務對象,然後在新的服務對象中為請求服務。服務器程序利用線程技術響應客戶請求已經司空見慣,可能您認為這樣做效率已經很高,但是當我們遇到大量的客戶並發地訪問應用服務器時采用這種服務器模型會有很多問題。我們采用線程池技術來解決這種單個任務處理時問很短而請求數目卻是巨大的這樣的難題。
目前,一些著名的大公司都特別看好這項技術,並早已經在他們的產品中應用該技術。比如IBM的WebSphere,IONA的Orbix 2000在SUN的Jini中,Microsoft的MTS(MicrosoftTransaction Server 2.0),COM+等。
2 引入線程池技術的原因
在應用服務器中需要處理從客戶端發起的任務請求,這些任務往往具有高密度、短時間的特性。無論通過什麼方式在服務器得到客戶端請求後,服務器都需要獨立地處理這個客戶請求。針對這個問題,線程池提供了處理係統性能和大用戶量請求之間的矛盾的方法。通過對多個任務重用已經存在的線程對象,降低了對線程對象創建和銷毀的開銷。當客戶請求時,線程對象已經存在,可以提高請求的響應時間,從而整體地提高了係統服務的表現。
多線程技術主要解決處理器單元內多個線程執行的問題,它可以使處理器盡量保持忙碌狀態,充分利用係統的可用資源,使得係統的性能得到顯著提高。但是如果對多線程技術應用不當的話,也會事與願違,可以通過一個簡單的例子來說明這一點。
線程執行過程分為三個部分:T1、T2、T3。其中T1表示線程創建的時間,T2表示線程執行任務所需時間,包括線程間同步所需時間,T3表示線程銷毀時間。那麼我們可以看出,執行任務所需時間T為T1+T2+T3,然而真正處理任務的時間為T2,線程本身的開銷為T1、T3兩部分之和,這樣線程開銷占總時間的比例為(T1+T3)/(T1+T2+T3)。如果任務處理的時間T2比較短小,那創建和銷毀的開銷所占的比例將會非常大,因而如何減少T1和T3兩部分時間是需要解決的問題。線程池正是著眼於減少T1和T3這兩部分時間的開銷,使得係統的效率提高。他把T1和T3分別安排在服務器程序啟動和結束的時間段或者一些空閑的時間段,這樣在服務器程序處理客戶請求時就不會T1和T3開銷了。
3 線程池技術優點
線程池技術有著如下幾個方麵的優點:
(1)可以控製產生線程的數量。通過預先創建一定數量的工作線程並限製其數量,控製線程對象的內存消耗。
(2)降低係統開銷和資源消耗。通過對多個請求重用線程、線程創建、銷毀的開銷被分攤到了多個請求上。另外就是通過限製線程數量、降低係統在垃圾回收方麵的開銷。
(3)提高係統響應速度。線程事先已被創建,請求到達時可直接進行處理,消除了因線程創建所帶來的時間延遲,另外多個線程可以並發處理。
(4)Java線程池的編程模型相對於原有的多線程編程模型來說,還有一大改進,那就是線程代碼和業務代碼的分離。
4線程池工作原理
一般來說實現一個線程池主要包括以下幾個組成部分:
(1)線程管理器:用於創建並管理線程池。
(2)工作線程:線程池中實際執行任務的線程。在初始化線程時會預先創建好固定數目的線程在池中,這些初始化的線程一般是處於空閑狀態,不消耗CPU,占用較小的內存空間。
(3)任務接口:每個任務必須實現的接口,當線程池中的可執行的任務時,被工作線程調試執行。把任務抽象出來形成任務接口,可以做到線程池與具體的任務無關。
(4)任務隊列:用來存放沒有處理的任務,提供一種緩衝機製。實現這種結構有好幾種方法,常用的是隊列,主要是利用它先進先出的工作原理;另外一種是鏈表之類的數據結構,可以動態為它分配內存空間,應用中比較靈活。我們用到的是鏈表數據結構形式來實現任務隊列。
最後更新:2017-04-03 07:57:03