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