專利名稱:一種線程池管理方法及其系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及通信領(lǐng)域的計算機應(yīng)用技術(shù),尤其涉及一種線程池管理方法及 其系統(tǒng)。
背景技術(shù):
在基于面向?qū)ο缶幊痰膽?yīng)用中,創(chuàng)建和銷毀對象是^f艮費時間的,因為創(chuàng)建
一個對象時要獲取內(nèi)存資源或者其它更多資源。在基于JAVA編程技術(shù)的應(yīng)用 中更是如此,JVM (Java Virtual Machine, JAVA虛擬才幾)將試圖跟蹤每一個對 象,以便能夠在對象銷毀后進行系統(tǒng)資源回收。
在實際應(yīng)用中,在基于面向?qū)ο缶幊痰姆?wù)器應(yīng)用中,尤其是WEB應(yīng)用, 應(yīng)用服務(wù)器利用線程技術(shù)響應(yīng)客戶請求已經(jīng)司空見慣,如果應(yīng)用服務(wù)器為每個 請求創(chuàng)建一個線程,開銷是相當大的,因為這會產(chǎn)生^f艮多創(chuàng)建和銷毀線程的動 作,致使應(yīng)用服務(wù)器在創(chuàng)建和銷毀線程上消耗大量的時間和系統(tǒng)資源,甚至可
能要比花在處理實際的用戶請求的時間和資源還要多。
除了創(chuàng)建和銷毀線程的開銷之外,活動的線程也需要消耗系統(tǒng)資源。如果
JVM短時間內(nèi)產(chǎn)生大量線程,可能會導(dǎo)致系統(tǒng)由于過度消耗內(nèi)存或切換過度而 資源不足。為了防止資源不足,服務(wù)器應(yīng)用程序需要一些辦法來限制任何給定 時刻處理的請求數(shù)目,盡可能減少創(chuàng)建和銷毀線程的次數(shù),特別是針對一些資 源耗費比較大的線程的創(chuàng)建和銷毀,最好盡量利用已有對象進行服務(wù),這就是 "線程池"技術(shù)產(chǎn)生的原因。
線程池技術(shù)通過對多個任務(wù)重用線程,使線程創(chuàng)建的開銷被分攤到多個任 務(wù)上。其好處是,因為在客戶請求到達時線程已經(jīng)存在,所以消除了線程創(chuàng)建 所帶來的延遲,使應(yīng)用程序響應(yīng)更快。但目前的線程池管理技術(shù)只是維護一組工作線程和一個任務(wù)隊列,使用線 程組中的工作線程循環(huán)執(zhí)行任務(wù)隊列中的任務(wù)。采用這種線程池管理技術(shù),一 旦任務(wù)執(zhí)行過程中出現(xiàn)異常,如,線程執(zhí)行某任務(wù)的時間過長或線程掛死,則 將影響應(yīng)用服務(wù)器執(zhí)行任務(wù)的效率。隨著應(yīng)用服務(wù)器不斷接受客戶請求進行業(yè) 務(wù)處理,出現(xiàn)異常的幾率也會隨之增加,而目前的線程池管理技術(shù)缺乏相應(yīng)的 監(jiān)控與自恢復(fù)能力,則相應(yīng)地應(yīng)用服務(wù)器線程池中的工作線程數(shù)量會因線程掛 死而逐漸減少,執(zhí)行任務(wù)的效率也會進一步降低。
發(fā)明內(nèi)容
本發(fā)明實施例提供了一種線程池管理方法及其系統(tǒng),以提高采用該種線程 池管理技術(shù)的應(yīng)用服務(wù)器的任務(wù)處理效率以及提高線程池的再生性。
本發(fā)明實施例提供的線程池管理方法,包括以下步驟 通過定時遍歷所述線程池中各線程,監(jiān)測各線程執(zhí)行當前任務(wù)的運行時
長;
當根據(jù)監(jiān)測到的運行時長確定有線程運行超時時,創(chuàng)建新的線程,并使用 新創(chuàng)建的線程執(zhí)行所述運行超時的線程所應(yīng)執(zhí)行的任務(wù)。
本發(fā)明實施例提供的線程池管理系統(tǒng),包括 任務(wù)隊列,用于存儲待處理的任務(wù); 任務(wù)執(zhí)行模塊,用于使用各線程執(zhí)行對應(yīng)的任務(wù);
任務(wù)監(jiān)控模塊,用于通過定時遍歷所述線程池中各線程,監(jiān)測各線程執(zhí)行 當前任務(wù)的運行時長;以及,當根據(jù)監(jiān)測到的運行時長確定有線程運行超時時, 創(chuàng)建新的線程,并指示所述任務(wù)執(zhí)行模塊使用新創(chuàng)建的線程執(zhí)行所述運行超時 的線程所應(yīng)執(zhí)行的任務(wù)。
本發(fā)明的上述實施例中,通過在線程執(zhí)行任務(wù)的過程中,監(jiān)測各線程當前 執(zhí)行任務(wù)的運行時長來確定是否有線程運行超時,若有線程超時,則創(chuàng)建新的 線程,并使用新創(chuàng)建的線程來執(zhí)行超時線程所應(yīng)執(zhí)行的任務(wù),從而減少了相應(yīng)任務(wù)隊列中的任務(wù)的執(zhí)行時間,并可一定程度上避免任務(wù)長時間大量積壓,進 而提高應(yīng)用服務(wù)器的運行效率。另外,通過本發(fā)明實施例在線程池中增加的任 務(wù)監(jiān)控機制,可以及時發(fā)現(xiàn)運行超時的線程,并及時創(chuàng)建新的任務(wù)來替代運行 超時的線程執(zhí)行任務(wù),從而為線程池技術(shù)提供了 一種線程再生機制和容錯機 制。
圖1為本發(fā)明實施例中的線程池的結(jié)構(gòu)示意圖; 圖2為本發(fā)明實施例中將任務(wù)分配到任務(wù)隊列的流程圖; 圖3為本發(fā)明實施例中將任務(wù)傳遞給線程執(zhí)行的流程圖; 圖4為本發(fā)明實施例中監(jiān)控任務(wù)執(zhí)行的流程圖。
具體實施例方式
本發(fā)明實施例通過在線程池管理功能中增加任務(wù)執(zhí)行情況的監(jiān)控功能,以 發(fā)現(xiàn)是否有任務(wù)運行超時,當有任務(wù)運行超時時及時創(chuàng)建新的線程,并使用新 創(chuàng)建的線程執(zhí)行運行超時的線程所對應(yīng)執(zhí)行的任務(wù),從而提高線程池的再生性 和任務(wù)執(zhí)行效率。下面結(jié)合附圖對本發(fā)明實施例進行詳細的描述。
通常,線程池主要包含有如下部件
線程池管理器(ThreadPoolManager):用來創(chuàng)建、查詢線程池,即維護應(yīng) 用程序中的所有線程池;
線程池實現(xiàn)類(ThreadPoolImpl):用來維護一個線程池,包括各個工作線 程的創(chuàng)建、銷毀、運行監(jiān)控、消息積壓控制、任務(wù)分配等等;
工作線程(ProcessThread):線程池中的線程對象,用來執(zhí)行用戶任務(wù), 其個數(shù)由線程池對象中的poolSize (線程池大小)變量決定;
任務(wù)隊列(taskList):用于存放待處理的任務(wù),提供一種緩存機制;
線程任務(wù)(PoolTask):每個放入線程池處理的任務(wù)都必須從該類繼承,以便工作線程調(diào)度任務(wù)的執(zhí)行;
任務(wù)積壓控制變量(maxWaitingTask):用于控制線程任務(wù)積壓,避免因任 務(wù)大量積壓而導(dǎo)致的系統(tǒng)異常。
本發(fā)明實施例中的線程池也包含這些部件,但其中的某些部件與以往的線 程池不同,如本發(fā)明實施例中的線程池管理器只用來創(chuàng)建、查詢線程池,即 維護應(yīng)用程序中的所有線程池,不操作工作線程;本發(fā)明實施例中的任務(wù)隊列 可為多個,每個線程對應(yīng)一個任務(wù)隊列,不同的線程對應(yīng)不同的任務(wù)隊列。
本發(fā)明實施例中的線程池在此基礎(chǔ)上還具備任務(wù)執(zhí)行情況的監(jiān)控功能,監(jiān) 控功能可通過以下部件實現(xiàn)
定時監(jiān)控任務(wù)(MonitorTask實例)定時^r查線程池中的任務(wù)運行情況, 控制線程再生及任務(wù)運行異常的處理;
線程運行控制變量組(runThdldx):用于控制線程運行,保證線程和任務(wù) 隊列之間的--^f應(yīng)關(guān)系。
上述線程池提供一個統(tǒng)一的對外接口 newTask,各種應(yīng)用通過調(diào)用該接口 將待處理的任務(wù)放入線程池中。newTask中規(guī)定了任務(wù)分配規(guī)則,通過遵循該 規(guī)則,可將每個線程;改入到一個任務(wù)隊列之中。
利用上述線程池對任務(wù)進行處理,包"fe以下關(guān)鍵流程
任務(wù)分配流程將待處理任務(wù)分配到任務(wù)隊列中,任務(wù)分配通過調(diào)用 newTask接口完成。newTask可根據(jù)任務(wù)Id確定用來緩存該任務(wù)的任務(wù)隊列, 從而將待處理任務(wù)分配到相應(yīng)的任務(wù)隊列中;newTask也可不依據(jù)任務(wù)Id,而 是將待處理任務(wù)較為平均地分配給任務(wù)隊列。之后,newTask可進一步根據(jù)目 標任務(wù)隊列中當前緩存的任務(wù)數(shù)量決定是否接收該任務(wù),從而避免任務(wù)積壓;
任務(wù)執(zhí)行流程工作線程從對應(yīng)的任務(wù)隊列中取出排在最前面的任務(wù)執(zhí) 行,即,采用先入先出的機制將任務(wù)隊列中的任務(wù)傳遞給對應(yīng)的工作線程執(zhí)行, 沒有任務(wù)時則等待;
任務(wù)監(jiān)控流程定時任務(wù)checkTask (MonitorTask實例)定時掃描(或遍歷)線程池中的所有線程,檢查線程當前執(zhí)行任務(wù)的運行時長,如果線程當前 執(zhí)行任務(wù)的運行時長超過一定限制值,則認為該線程已掛死,此時,記錄超時 的任務(wù)信息,并創(chuàng)建新線程來處理相應(yīng)任務(wù)隊列中的任務(wù),以免任務(wù)長時間大 量積壓造成系統(tǒng)異常,從而實現(xiàn)線程池的監(jiān)控、容確昔及線程再生功能。
下面結(jié)合圖1、圖2、圖3和圖4,對本發(fā)明實施例的線程池結(jié)構(gòu),以及該 線程池的關(guān)鍵方法的實現(xiàn)過程進行詳細描述,包括任務(wù)分配、任務(wù)執(zhí)行和任務(wù) 監(jiān)控方法的實現(xiàn)過程。
參見圖1,為本發(fā)明實施例中的線程池的內(nèi)部結(jié)構(gòu)示意圖,如圖所示,線 程池中的元素主要包括
1、 基本參數(shù),包括 thdGroup:線程組; poolName:線程池名稱;
poolSize:線程池大小,即池中的線程個數(shù); checkTask:監(jiān)控任務(wù),MonitorTask實例;
maxWaitingTask:單個線程允許的最大等待任務(wù)數(shù),用于控制任務(wù)積壓;
2、 運行參數(shù),包括
currentThdldx:當前線程標識,標志著已經(jīng)創(chuàng)建的線程數(shù),包括再生的線 程個數(shù);本實施例中,線程標識根據(jù)線程創(chuàng)建的順序從O開始依次遞增; deadThdNum:線程池中掛死的線程個數(shù); thdLockObj:線程鎖對象,同步變量時使用;
checkCount: int數(shù)組,用于記錄各個線程的檢測計數(shù),超過一定值則認為 該線程已掛死,需再生線程;該數(shù)組中的元素記為checkCount[i],表示標識為 i的線程的檢測計數(shù)值;
addTaskCount:線程池接收的任務(wù)總數(shù);
3、 PoolTask:線程任務(wù)類,所有放入線程池中處理的任務(wù)都需繼承該類, 主要方法有process() 、 getTaskName() 、 getTaskld();4、 ProcessThread:線程類,包含兩個基本變量tid和thdldx, tid (其值為 0~poolSize-l )是線程在線程池中的索引,線程根據(jù)該索引從相應(yīng)的任務(wù)隊列
(即隊列索引值為tid的任務(wù)隊列)中獲取待執(zhí)行的任務(wù),thdldx(其值為0 currentThdldx)是線程的唯一標識,也表示該線程是線程池中創(chuàng)建的第幾個線 程;線程運行時執(zhí)行任務(wù)的 process方法;
5、 taskList:線程池任務(wù)隊列數(shù)組,每個線程對應(yīng)一個任務(wù)隊列,每個任 務(wù)隊列都是一個LinkedList實例,任務(wù)隊列中的每個任務(wù)都應(yīng)繼承自PoolTask 類,釆用先入先出機制;每個任務(wù)隊列有其索引值,在一個線程池中,各任務(wù) 隊列的索引值唯一;
6、 currentTask: PoolTask數(shù)組變量,用于暫存各個線程當前正在執(zhí)行的任 務(wù)的屬性信息,以便任務(wù)運行超時時獲取當前運行任務(wù)的屬性信息,如任務(wù)名 稱、任務(wù)id等;該數(shù)組中的元素記為currentTask[i],其中記錄了標識為i的線 程當前所執(zhí)行的任務(wù)的相關(guān)信息;
7、 runThdldx: int數(shù)組,用于保存線程池中線程任務(wù)隊列索引值和線程標 識之間的對應(yīng)關(guān)系,初始化時任務(wù)隊列索引和線程標識一致,如runThdIdx[2]=2 表示索引值為2的任務(wù)隊列(即taskList[2])的任務(wù)執(zhí)行線程是thdldx為2的 線程,當某個任務(wù)運行超時時,相應(yīng)的runThdIdx值會改變;
8、 newTask:業(yè)務(wù)接入方法,上層應(yīng)用通過該方法將需執(zhí)行的任務(wù)放入線 程池中,該方法負責(zé)將任務(wù)分配到具體的任務(wù)隊列;
9、 MonitorTask:線程池監(jiān)控類,繼承TimerTask,用于監(jiān)控各個線程的任 務(wù)運行是否超時,超時則認為線程掛死,此時創(chuàng)建新線程執(zhí)行相應(yīng)任務(wù)隊列中 的任務(wù),從而實現(xiàn)線程再生功能。
參見圖2,為本發(fā)明實施例中的newTask方法的流程圖,該方法是上層應(yīng) 用接入到線程池的入口,同時完成任務(wù)分配的功能。入口參數(shù)包括繼承了 PoolTask類的對象實例task,對象實例task繼承了 PoolTask類的方法 getTaskld()。該流程的主要步驟描述如下的方法getTaskld(),返回值賦給臨時變量id。通過該 步驟可為后續(xù)確定任務(wù)分配原則,以及進一步為任務(wù)分配過程提供必要的參數(shù)。
PoolTask類中g(shù)etTaskld()方法默認返回-l。本實施例中,繼承自PoolTask 的任務(wù)類可以覆蓋該方法,此時,id為getTaskld()方法默認返回值-l,也可以 不覆蓋該方法,此時,id值為通過getTaskld()方法獲取到的待分配任務(wù)的Id。
步驟202、判斷id是否大于0,大于0執(zhí)行步驟203,否則,執(zhí)行步驟204。 通過該步驟可確定出任務(wù)分配原則。
getTaskld()方法返回的id值與任務(wù)分配原則存在對應(yīng)關(guān)系,通過該id值可 確定需要采用的任務(wù)分配原則,使newTask方法根據(jù)id值進行任務(wù)分配。id 的取值范圍不同(idX)或icKO)對應(yīng)的分配原則也不同。
步驟203、 idX)時,將id和poolSize取余,結(jié)果值賦給臨時變量seq (其 值表示目標任務(wù)隊列的索引值),以確定出目標任務(wù)隊列。
步驟204、 id〈0時,將addTaskCount和poolSize取余,結(jié)果值賦給臨時變 量seq (其值表示目標任務(wù)隊列的索引值),以確定出目標任務(wù)隊列。
步驟205、判斷索引值為seq的任務(wù)隊列中的任務(wù)數(shù)是否超過最大允許等 待任務(wù)數(shù)maxWaitingTask,如果小于maxWaitingTask,則執(zhí)行步驟206;否則 拒絕接收該任務(wù),并以拋出異常結(jié)束本流程。通過該步驟可將任務(wù)隊列中等待 執(zhí)行的任務(wù)數(shù)控制在一定數(shù)量之內(nèi),從而避免任務(wù)積壓而影響應(yīng)用服務(wù)器的處 理效率。
步驟206、將待分配的任務(wù)添加到索引值為seq的任務(wù)隊列中。 步驟207、喚醒索引值為s叫的任務(wù)隊列。 步驟208、將線程池接收的任務(wù)總數(shù)addTaskCount加1。 通過圖2所示的流程可以看出,將addTaskCount與poolSize取余的結(jié)果值 作為目標任務(wù)隊列的索引值,并將任務(wù)分配到該索引值對應(yīng)的任務(wù)隊列中,可 以將任務(wù)較為平均地分配到各個任務(wù)隊列;將id (任務(wù)Id)與poolSize取余的結(jié)果值作為目標任務(wù)隊列的索引值,并將任務(wù)分配到該索引值對應(yīng)的隊列中,
此時,任務(wù)分配和任務(wù)Id有關(guān),具有相同任務(wù)Id的任務(wù)會被分配到同一個任 務(wù)隊列,由同一個線程處理,因此,應(yīng)用可以通過設(shè)置任務(wù)Id來控制任務(wù)執(zhí) 行的先后順序,如,應(yīng)用程序可將需要先后執(zhí)行的任務(wù)設(shè)置為相同的Id,并按
照執(zhí)行的先后順序放到同 一任務(wù)隊列,利用任務(wù)隊列先入先出^L制來控制這些
任務(wù)執(zhí)行的先后順序。
對于圖2所示的流程,需要說明的是確定目標任務(wù)隊列索引值的方法不 僅限于上述算法,對于本領(lǐng)域技術(shù)人員來說,容易想到其他的替代算法。另夕卜, 若能夠預(yù)知getTaskld()方法返回的id值的范圍(id>0或id<0 ),則可省略判斷 id取值范圍的步驟,而直接采用與id取值范圍對應(yīng)的任務(wù)分配原則來分配任務(wù) 到任務(wù)隊列。
參見圖3,為本發(fā)明實施例中的ProcessThread類run方法的流程圖,線程 池中的所有線程都是ProcessThread類的實例,run方法是線程執(zhí)行的操作,整 個方法是一個循環(huán)判斷、執(zhí)行任務(wù)的過程,主要包括以下步驟 步驟301、判斷runThdldx中值為tid的任務(wù)隊列索引值所對應(yīng)的線程標識 是否與thdldx (thdldx值為本線程的標識) 一致,如果不一致,表明當前的線 程的標識與當前任務(wù)隊列的索引值的對應(yīng)關(guān)系,與runThdldx中記錄的對應(yīng)關(guān) 系不一致,則執(zhí)行步驟302;如果一致,表明當前的線程的標識與當前任務(wù)隊 列的索引值的對應(yīng)關(guān)系,與runThdldx中記錄的對應(yīng)關(guān)系 一致,則執(zhí)行步驟303 。
其中,tid和thdldx是ProcessThread類的基本變量,tid值表示當前任務(wù)隊 列的索引值,thdldx的值表示當前線程的標識;runThdldx是int數(shù)組,該數(shù)組 中保存有線程池中任務(wù)隊列索引值和線程標識之間的對應(yīng)關(guān)系。
步驟302、桂死線程計數(shù)deadThdNum減1,該操作需使用thdLockObj變 量同步,之后線程運行結(jié)束。
步驟303 、將臨時變量task賦值為空(task=null),以防止task值受上次循 環(huán)值的影響。步驟304、將checkCount數(shù)組中的checkCount[tid]賦值為0,即,將索引 值為tid的任務(wù)隊列所對應(yīng)的線程的checkCount值(檢測計數(shù)值)清0,以表 示對應(yīng)該任務(wù)隊列索引值的線程正在運行。
步驟305、判斷索引值為tid的任務(wù)隊列(taskList[tid])是否為空,為空則 執(zhí)行操作306,否則,執(zhí)行操作307。
步驟306、調(diào)用taskList[tid]對象的wait()方法,使當前線程處于等待狀態(tài), 直到其他線程調(diào)用taskList[tid]對象的notify()方法喚醒該線程(如newTask中 的步驟207),線程被喚醒后轉(zhuǎn)到步驟305。
步驟307、判斷taskList[tid]的大小是否大于0,大于0則執(zhí)行步驟308, 否則,轉(zhuǎn)到步驟310。
步驟308、從taskList[tid]中取第一個任務(wù)賦給變量task。
步驟309、將task賦值給currentTask[tid],以記錄本線程當前正在執(zhí)行的 任務(wù)的屬性信息。該步驟可選。
步驟310、判斷臨時變量task是否為空,不為空則執(zhí)行步驟311,為空則 轉(zhuǎn)到步驟301開始下一次循環(huán)。
步驟311、調(diào)用對象實例task的process()方法,執(zhí)行任務(wù),之后轉(zhuǎn)到步驟 301開始下一次循環(huán)。
每個線程都按照圖3所示的流程進行循環(huán)判斷、執(zhí)行任務(wù),從而將任務(wù)隊 列中的任務(wù)傳遞給與該任務(wù)隊列所對應(yīng)的線程執(zhí)行。在任務(wù)隊列中的所有任務(wù) 執(zhí)行完成后將線程歸還給線程池。上述流程中的步驟301的判斷步驟是線程是 否繼續(xù)運行的關(guān)^^建,它確保了只有在當前線程和當前^f壬務(wù)隊列的對應(yīng)關(guān)系符合 runThdldx所記錄的對應(yīng)關(guān)系時,才執(zhí)行任務(wù),從而確保了線程與任務(wù)隊列的 一一對應(yīng)關(guān)系。另外,由于再生線程后,需要將再生線程與相應(yīng)的任務(wù)隊列建 立對應(yīng)關(guān)系,從而利用再生線程執(zhí)行對應(yīng)任務(wù)隊列中的任務(wù),因此, 一定程度 上保證了任務(wù)運行超時的線程所應(yīng)執(zhí)行的任務(wù)能夠通過再生線程執(zhí)行并正常 結(jié)束。參見圖4,為本發(fā)明實施例中的MonitorTask監(jiān)控流程圖,線程池的定時 器任務(wù)checkTask是MonitorTask類的實例,用于監(jiān)控線程池中的所有線程, 以便任務(wù)運行超時時實現(xiàn)線程再生,每個監(jiān)控周期的流程主要包括以下步驟
步驟401、將臨時變量i賦值為0。
步驟402、判斷i是否小于poolSize, i小于poolSize,說明還未遍歷完線 程池中所有的線程,則執(zhí)行步驟403;否則,說明已遍歷完成線程池中所有的 線程,本次監(jiān)控流程結(jié)束。
步驟403、判斷索引為i的任務(wù)隊列taskList[i]是否為空,為空則表明該線 程沒有需要處理的任務(wù),此時對當前處理任務(wù)不做運行時間限制,轉(zhuǎn)到步驟 412;否則,執(zhí)行步驟404。
步驟404、將標識為i的線程的檢測計數(shù)值checkCount[i]加1;
步驟405、判斷checkCount[i]是否超過預(yù)先設(shè)置的閾值,如果超過該閾值 (如checkCount[i]>5 )說明當前任務(wù)運行時長已經(jīng)超過規(guī)定數(shù)量的檢測周期, 即任務(wù)運行超時,則執(zhí)行步驟406;否則(如checkCount[i]<5 ),轉(zhuǎn)到步驟412。
步驟406、提取出currentTask[i]中記錄的任務(wù)屬性信息(currentTask[i]中記 錄了標識為i的線程當前運行的任務(wù)的屬性信息,其中包括任務(wù)名稱、任務(wù)Id 等),并記錄在日志中,作為后續(xù)分析運行超時的原因或進一步排查問題的依 據(jù)。該步驟可選。
步驟407、將掛死線程計數(shù)deadThdNum力口 1,該操作需使用thdLockObj 變量同步,之后進入線程再生處理部分。
步驟408、將線程標識currentThdldx加1,得到的值將作為新創(chuàng)建的線程 的標識。其中,currentThdldx表示已經(jīng)創(chuàng)建的線程數(shù)量,也即值最大的線程標 識,新創(chuàng)建的線程的標識在此基礎(chǔ)上遞增。
步驟409、將runThdldx[i]賦值為currentThdldx,即,將標識為i的線程所 對應(yīng)的任務(wù)隊列與新創(chuàng)建的線程的標識建立對應(yīng)關(guān)系,以替代該任務(wù)隊列與標 識為i的線程的對應(yīng)關(guān)系,表明任務(wù)隊列taskList[i]中的任務(wù)由再生的線程currentThdldx處理。
步驟410、創(chuàng)建新線程,tid為i,線程標識為currentThdldx。 步驟411、啟動新線程。
步驟412、將i力。1,之后轉(zhuǎn)到步驟步驟402,開始檢測下一個線程的運行 情況。
結(jié)合圖3和圖4可以看出,當線程在接收到一個任務(wù)開始執(zhí)行之前,將該 線程對應(yīng)的檢測計數(shù)值checkCount清0,在監(jiān)控周期內(nèi),將該線程對應(yīng)的檢測 計數(shù)值checkCount遞增,這樣,該線程所對應(yīng)的4企測計數(shù)值可用來表4正該線程 執(zhí)行當前任務(wù)所用的時長(也即該任務(wù)的運行時長),因而通過線程的檢測計 數(shù)值可以判斷出線程執(zhí)行當前任務(wù)所用的時長(也即該任務(wù)的運行時長)是否 超時。通過圖4所示的流程可以看出,定時器任務(wù)checkTask周期遍歷線程池 中的線程,當檢測到某個線程在規(guī)定的時長(監(jiān)控周期時長x閾值)達到時還 沒有執(zhí)行完當前任務(wù)時,認為該線程的運行時長超時,進而認為其已桂死,此 時通過創(chuàng)建新線程,并將認為已掛死的線程所對應(yīng)的^f壬務(wù)隊列與新創(chuàng)建的線程 建立對應(yīng)關(guān)系,從而由新創(chuàng)建的線程執(zhí)行該任務(wù)隊列中的任務(wù)。通常情況下, 線程執(zhí)行任務(wù)所用的時間較短,如果線程執(zhí)行任務(wù)所用的時間超過一定長度, 則很可能是出現(xiàn)了異常情況,而線程執(zhí)行任務(wù)所用時間過長,將導(dǎo)致其他任務(wù) 不能及時執(zhí)行,延遲客戶請求的響應(yīng)速度,以及任務(wù)長時間大量積壓造成應(yīng)用 服務(wù)器系統(tǒng)異常,降低應(yīng)用服務(wù)器的運行效率。本實施例中,通過用新創(chuàng)建的 線程來代替運行超時的線程完成相應(yīng)任務(wù)隊列中的任務(wù),減少了相應(yīng)任務(wù)隊列 中的任務(wù)的執(zhí)行時間,并可一定程度上避免任務(wù)長時間大量積壓,提高應(yīng)用服 務(wù)器的運行效率。另外,通過本發(fā)明實施例在線程池中增加的任務(wù)監(jiān)控機制, 可以及時發(fā)現(xiàn)運行超時的線程,并及時創(chuàng)建新的任務(wù)來替代運行超時的線程執(zhí) 行任務(wù),從而提供了一種線程再生機制和容錯機制。
對于圖4所示的流程,需要說明的是遍歷線程池中的所有線程時,可以 象上述流程一樣,從最小標識的線程開始遍歷,也可以從最大標識的線程開始遍歷,還可以以其他順序遍歷線程。
上述各流程可分別由軟件代碼實現(xiàn),不同的流程對應(yīng)不同的代碼^t塊,例
如,圖2所示的任務(wù)分配流程所對應(yīng)的代碼模塊可稱為任務(wù)分配模塊,圖3所 示的任務(wù)執(zhí)行流程所對應(yīng)的代碼模塊可稱為任務(wù)執(zhí)行模塊,圖4所示的任務(wù)監(jiān) 控流程所對應(yīng)的代碼模塊可稱為任務(wù)監(jiān)控模塊。其中,任務(wù)分配模塊利用線程 任務(wù)類PoolTask實現(xiàn),任務(wù)執(zhí)行模塊利用線程類ProcessThread實現(xiàn),任務(wù)監(jiān) 控模塊利用線程池監(jiān)控類MonitorTask實現(xiàn)。上述代碼才莫塊結(jié)合圖1所示的線 程池,可構(gòu)成本發(fā)明實施例中的線程池管理系統(tǒng)。
本發(fā)明實施例提供的線程池管理系統(tǒng)包括線程池和功能模塊。其中 線程池包括任務(wù)隊列(任務(wù)隊列與線程池中的線程一~~^對應(yīng))和runThdldx 數(shù)組(相當于用于存儲線程和任務(wù)隊列對應(yīng)關(guān)系的對應(yīng)關(guān)系存儲模塊,所述對 應(yīng)關(guān)系為線程的標識與任務(wù)隊列索引值的對應(yīng)關(guān)系); 功能模塊包括
任務(wù)執(zhí)行模塊,用于使用線程池中的各線程執(zhí)行對應(yīng)任務(wù)隊列中的任務(wù);
任務(wù)監(jiān)控模塊,用于通過定時遍歷線程池中各線程,監(jiān)測各線程當前執(zhí)行 任務(wù)的運行時長;以及,當根據(jù)監(jiān)測到的運行時長確定有任務(wù)運行超時時,創(chuàng) 建新的線程,并指示任務(wù)執(zhí)行模塊使用新創(chuàng)建的線程執(zhí)行運行超時的線程所對 應(yīng)的任務(wù)隊列中的任務(wù);
上述系統(tǒng)還可進一步包括任務(wù)分配模塊,該模塊用于將待分配的任務(wù)分配 到線程池中的任務(wù)隊列。該模塊可以通過以下方式進行任務(wù)分配獲取待分配 任務(wù)的標識,將獲取到的任務(wù)標識與線程池中線程的數(shù)量取余運算,或者將線 程池中當前已分配的任務(wù)總數(shù)與線程池中線程的數(shù)量取余運算;然后將待分配 的任務(wù)分配到索引值為取余運算結(jié)果值的任務(wù)隊列中。
上述各功能模塊的執(zhí)行過程以及具有的功能在前述相應(yīng)處理流程中已經(jīng) 描述,在此不再贅述。
需要說明的是,上述實施例雖然均以線程池中的線程與任務(wù)隊列——對應(yīng)為前提進行描述,但本發(fā)明并不局限于這種線程與任務(wù)隊列的對應(yīng)關(guān)系。例如, 多個線程可對應(yīng)同 一任務(wù)隊列,從而通過多個線程來執(zhí)行該任務(wù)隊列中的任 務(wù)。
綜上所述,本發(fā)明實施例提供的線程池管理技術(shù)不僅解決了線程生命周期 的開銷問題和資源不足問題,提高了服務(wù)器的工作效率,同時具有監(jiān)控和容錯 功能,實現(xiàn)了線程再生及可選任務(wù)分配機制,并能幫助應(yīng)用準確定位出運行異 常的任務(wù),從而提高了應(yīng)用服務(wù)器的性能和穩(wěn)定性。
明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及 其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。
權(quán)利要求
1、一種線程池管理方法,其特征在于,包括以下步驟通過定時遍歷所述線程池中各線程,監(jiān)測各線程執(zhí)行當前任務(wù)的運行時長;當根據(jù)監(jiān)測到的運行時長確定有線程運行超時時,創(chuàng)建新的線程,并使用新創(chuàng)建的線程執(zhí)行所述運行超時的線程所應(yīng)執(zhí)行的任務(wù)。
2、 如權(quán)利要求1所述的方法,其特征在于,線程接收到當前任務(wù)進行執(zhí) 行之前,還包括將所述線程對應(yīng)的檢測計數(shù)值清零;定時遍歷各線程的過程中,在每個周期內(nèi),逐一遍歷線程池中的所有線程, 并將遍歷到的線程的檢測計數(shù)值加1,然后判斷該線程的檢測計數(shù)值是否超過 閾值,如果超過,則認為該線程運行超時;否則,認為該線程運行未超時。
3、 如權(quán)利要求1或2所述的方法,其特征在于,線程池中的線程與任務(wù) 隊列——對應(yīng),各線程執(zhí)行對應(yīng)任務(wù)隊列中的任務(wù);所述運行超時的線程所應(yīng)執(zhí)行的任務(wù)為所述運行超時的線程所對應(yīng)的任 務(wù)隊列中的任務(wù)。
4、 如權(quán)利要求3所述的方法,其特征在于,使用新創(chuàng)建的線程執(zhí)行所述 運行超時的線程所對應(yīng)的任務(wù)隊列中的任務(wù)之前,還包括將所述運行超時的 線程所對應(yīng)的任務(wù)隊列,與新創(chuàng)建的線程建立對應(yīng)關(guān)系,并以新建立的對應(yīng)關(guān) 系替代該任務(wù)隊列與所述運行超時的線程的對應(yīng)關(guān)系。
5、 如權(quán)利要求3所述的方法,其特征在于,線程與任務(wù)隊列的對應(yīng)關(guān)系 為線程標識與任務(wù)隊列索引值的對應(yīng)關(guān)系;線程執(zhí)行任務(wù),具體為判斷所述線程的標識是否與所述對應(yīng)關(guān)系中與當 前任務(wù)隊列的索引值對應(yīng)的線程標識一致,如果一致,則將當前任務(wù)隊列中的 任務(wù)以先入先出機制傳遞給所述線程,并使用所述線程執(zhí)行接收到的任務(wù);如 果不一致,則結(jié)束執(zhí)行任務(wù)的流程。
6、 如權(quán)利要求2所述的方法,其特征在于,各線程執(zhí)行對應(yīng)任務(wù)隊列中 的任務(wù)之前,還包括獲取待分配任務(wù)的標識,將獲取到的任務(wù)標識與線程池中線程的數(shù)量取余 運算;將所述待分配的任務(wù)分配到索引值為取余運算結(jié)果值的任務(wù)隊列中; 或者,各線程執(zhí)行對應(yīng)任務(wù)隊列中的任務(wù)之前,還包括 將線程池中當前已分配的任務(wù)總數(shù)與線程池中線程的數(shù)量取余運算;將待 分配的任務(wù)分配到索引值為取余運算結(jié)果值的任務(wù)隊列中。
7、 如權(quán)利要求6所述的方法,其特征在于,在判斷索引值為取余運算結(jié) 果值的任務(wù)隊列中的任務(wù)數(shù)小于最大允許等待任務(wù)數(shù)時,將待分配的任務(wù)分配 到該任務(wù)隊列中。
8、 一種線程池管理系統(tǒng),其特征在于,包括 任務(wù)隊列,用于存儲待處理的任務(wù); 任務(wù)執(zhí)行模塊,用于使用各線程執(zhí)行對應(yīng)的任務(wù);任務(wù)監(jiān)控模塊,用于通過定時遍歷所述線程池中各線程,監(jiān)測各線程執(zhí)行 當前任務(wù)的運行時長;以及,當根據(jù)監(jiān)測到的運行時長確定有線程運行超時時, 創(chuàng)建新的線程,并指示所述任務(wù)執(zhí)行模塊使用新創(chuàng)建的線程執(zhí)行所述運行超時 的線程所應(yīng)執(zhí)行的任務(wù)。
9、 如權(quán)利要求8所述的系統(tǒng),其特征在于,程池中的線程與任務(wù)隊列一 一對應(yīng),所述系統(tǒng)還包4舌對應(yīng)關(guān)系存儲模塊,用于存儲任務(wù)隊列與程池中的線程的對應(yīng)關(guān)系; 所述任務(wù)執(zhí)行模塊使用各線程執(zhí)行對應(yīng)任務(wù)隊列中的任務(wù); 所述任務(wù)監(jiān)控模塊指示所述任務(wù)執(zhí)行模塊使用新創(chuàng)建的線程執(zhí)行所述運 行超時的線程所對應(yīng)的任務(wù)隊列中的任務(wù)。
10、 如權(quán)利要求9所述的系統(tǒng),其特征在于,還包括 任務(wù)分配模塊,用于獲取待分配任務(wù)的標識,將獲取到的任務(wù)標識與線程池中線程的數(shù)量取余運算,或者將線程池中當前已分配的任務(wù)總數(shù)與線程池中線程的數(shù)量取余運算;然后將待分配的任務(wù)分配到索引值為取余運算結(jié)果值的任務(wù)隊列中。
全文摘要
本發(fā)明公開了一種線程池管理方法及其系統(tǒng),該方法包括通過定時遍歷所述線程池中各線程,監(jiān)測各線程執(zhí)行當前任務(wù)的運行時長;當根據(jù)監(jiān)測到的運行時長確定有線程運行超時時,創(chuàng)建新的線程,并使用新創(chuàng)建的線程執(zhí)行所述運行超時的線程所應(yīng)執(zhí)行的任務(wù)。其中,線程池中的線程與任務(wù)隊列一一對應(yīng),各線程執(zhí)行對應(yīng)任務(wù)隊列中的任務(wù);所述運行超時的線程所應(yīng)執(zhí)行的任務(wù)為所述運行超時的線程所對應(yīng)的任務(wù)隊列中的任務(wù)。采用本發(fā)明,可提高采用該線程池管理技術(shù)的應(yīng)用服務(wù)器的任務(wù)處理效率,并為線程池提供了容錯機制和線程再生機制。
文檔編號G06F9/48GK101599027SQ20091015074
公開日2009年12月9日 申請日期2009年6月30日 優(yōu)先權(quán)日2009年6月30日
發(fā)明者萍 王 申請人:中興通訊股份有限公司