線程池是一種多執行緒形式,處理過程中將任務添加到隊列,然後在建立線程後自動啟動這些任務。線程池線程都是後台線程。每個線程都使用預設的堆棧大小,以預設的優先順序運行,並處於多執行緒 Apartment中。如果某個線程在Managed 程式碼中空閑(如正在等待某個事件),則線程池將插入另一個輔助線程來使所有處理器保持繁忙。如果所有線程池線程都始終保持繁忙,但隊列中包含掛起的工作,則線程池將在一段時間後建立另一個輔助線程但線程的數目永遠不會超過最大值。超過最大值的線程可以排隊,但他們要等到其他線程完成後才啟動。
組成部分
1、線程池管理器(ThreadPoolManager):用於建立並管理線程池
2、背景工作執行緒(WorkThread): 線程池中線程
3、任務介面(Task):每個任務必須實現的介面,以供背景工作執行緒調度任務的執行。
4、任務隊列:用於存放沒有處理的任務。提供一種緩衝機制。
技術背景編輯
在物件導向編程中,建立和銷毀對象是很費時間的,因為建立一個對象要擷取記憶體資源或者其它更多資源。在Java中更是如此,虛擬機器將試圖跟蹤每一個對象,以便能夠在對象銷毀後進行記憶體回收。所以提高服務程式效率的一個手段就是儘可能減少建立和銷毀對象的次數,特別是一些很耗資源的對象建立和銷毀。如何利用已有對象來服務就是一個需要解決的關鍵問題,其實這就是一些"池化資源"技術產生的原因。比如大家所熟悉的資料庫連接池正是遵循這一思想而產生的,本文將介紹的線程池技術同樣符合這一思想。
目前,一些著名的大公司都特別看好這項技術,並早已經在他們的產品中應用該技術。比如IBM的WebSphere,IONA的Orbix 2000在SUN的 Jini中,Microsoft的MTS(Microsoft Transaction Server 2.0),COM+等。
4功能編輯
應用程式可以有多個線程,這些線程在休眠狀態中需要耗費大量時間來等待事件發生。其他線程可能進入睡眠狀態,並且僅定期被喚醒以輪循更改或更新狀態資訊,然後再次進入休眠狀態。為了簡化對這些線程的管理,.NET架構為每個進程提供了一個線程池,一個線程池有若干個等待操作狀態,當一個等待操作完成時,線程池中的輔助線程會執行回呼函數。線程池中的線程由系統管理,程式員不需要費力於線程管理,可以集中精力處理應用程式任務。
應用範圍編輯1、需要大量的線程來完成任務,且完成任務的時間比較短。 WEB伺服器完成網頁請求這樣的任務,使用線程池技術是非常合適的。因為單個任務小,而任務數量巨大,你可以想象一個熱門網站的點擊次數。 但對於長時間的任務,比如一個Telnet串連請求,線程池的優點就不明顯了。因為Telnet會話時間比線程的建立時間大多了。2、對效能要求苛刻的應用,比如要求伺服器迅速響應客戶請求。3、接受突發性的大量請求,但不至於使伺服器因此產生大量線程的應用。突發性大量客戶請求,在沒有線程池情況下,將產生大量線程,雖然理論上大部分作業系統線程數目最大值不是問題,短時間內產生大量線程可能使記憶體到達極限,並出現"OutOfMemory"的錯誤。
Java線程池原理及實現
簡單介紹
建立線程有兩種方式:繼承Thread或實現Runnable。Thread實現了Runnable介面,提供了一個空的run()方法,所以不論是繼承Thread還是實現Runnable,都要有自己的run()方法。
一個線程建立後就存在,調用start()方法就開始運行(執行run()方法),調用wait進入等待或調用sleep進入休眠期,順利運行完畢或休眠被中斷或運行過程中出現異常而退出。
wait和sleep比較:
sleep方法有:sleep(long millis),sleep(long millis, long nanos),調用sleep方法後,當前線程進入休眠期,暫停執行,但該線程繼續擁有監視資源的所有權。到達休眠時間後線程將繼續執行,直到完成。若在休眠期另一線程中斷該線程,則該線程退出。
wait方法有:wait(),wait(long timeout),wait(long timeout, long nanos),調用wait方法後,該線程放棄監視資源的所有權進入等待狀態;
wait():等待有其它的線程調用notify()或notifyAll()進入調度狀態,與其它線程共同爭奪監視。wait()相當於wait(0),wait(0, 0)。
wait(long timeout):當其它線程調用notify()或notifyAll(),或時間到達timeout亳秒,或有其它某線程中斷該線程,則該線程進入調度狀態。
wait(long timeout, long nanos):相當於wait(1000000*timeout + nanos),只不過時間單位為納秒。
線程池:
多線程技術主要解決處理器單元內多個線程執行的問題,它可以顯著減少處理器單元的閑置時間,增加處理器單元的吞吐能力。
假設一個伺服器完成一項任務所需時間為:T1 建立線程時間,T2 線上程中執行任務的時間,T3 銷毀線程時間。
如果:T1 + T3 遠大於 T2,則可以採用線程池,以提高伺服器效能。
一個線程池包括以下四個基本組成部分:
1、線程池管理器(ThreadPool):用於建立並管理線程池,包括 建立線程池,銷毀線程池,添加新任務;
2、背景工作執行緒(PoolWorker):線程池中線程,在沒有任務時處於等待狀態,可以迴圈的執行任務;
3、任務介面(Task):每個任務必須實現的介面,以供背景工作執行緒調度任務的執行,它主要規定了任務的入口,任務執行完後的收尾工作,任務的執行狀態等;
4、任務隊列(taskQueue):用於存放沒有處理的任務。提供一種緩衝機制。
線程池技術正是關注如何縮短或調整T1,T3時間的技術,從而提高伺服器程式效能的。它把T1,T3分別安排在伺服器程式的啟動和結束的時間段或者一些閒置時間段,這樣在伺服器程式處理客戶請求時,不會有T1,T3的開銷了。
線程池不僅調整T1,T3產生的時間段,而且它還顯著減少了建立線程的數目,看一個例子:
假設一個伺服器一天要處理50000個請求,並且每個請求需要一個單獨的線程完成。線上程池中,線程數一般是固定的,所以產生線程總數不會超過線程池中線程的數目,而如果伺服器不利用線程池來處理這些請求則線程總數為50000。一般線程池大小是遠小於50000。所以利用線程池的伺服器程式不會為了建立50000而在處理請求時浪費時間,從而提高效率。