国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種線程池管理方法及其系統(tǒng)的制作方法

      文檔序號(hào):6578933閱讀:170來源:國知局
      專利名稱:一種線程池管理方法及其系統(tǒng)的制作方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及通信領(lǐng)域的計(jì)算機(jī)應(yīng)用技術(shù),尤其涉及一種線程池管理方法及 其系統(tǒng)。
      背景技術(shù)
      在基于面向?qū)ο缶幊痰膽?yīng)用中,創(chuàng)建和銷毀對(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ì)象銷毀后進(jìn)行系統(tǒng)資源回收。
      在實(shí)際應(yīng)用中,在基于面向?qū)ο缶幊痰姆?wù)器應(yīng)用中,尤其是WEB應(yīng)用, 應(yīng)用服務(wù)器利用線程技術(shù)響應(yīng)客戶請(qǐng)求已經(jīng)司空見慣,如果應(yīng)用服務(wù)器為每個(gè) 請(qǐng)求創(chuàng)建一個(gè)線程,開銷是相當(dāng)大的,因?yàn)檫@會(huì)產(chǎn)生^f艮多創(chuàng)建和銷毀線程的動(dòng) 作,致使應(yīng)用服務(wù)器在創(chuàng)建和銷毀線程上消耗大量的時(shí)間和系統(tǒng)資源,甚至可
      能要比花在處理實(shí)際的用戶請(qǐng)求的時(shí)間和資源還要多。
      除了創(chuàng)建和銷毀線程的開銷之外,活動(dòng)的線程也需要消耗系統(tǒng)資源。如果
      JVM短時(shí)間內(nèi)產(chǎn)生大量線程,可能會(huì)導(dǎo)致系統(tǒng)由于過度消耗內(nèi)存或切換過度而 資源不足。為了防止資源不足,服務(wù)器應(yīng)用程序需要一些辦法來限制任何給定 時(shí)刻處理的請(qǐng)求數(shù)目,盡可能減少創(chuàng)建和銷毀線程的次數(shù),特別是針對(duì)一些資 源耗費(fèi)比較大的線程的創(chuàng)建和銷毀,最好盡量利用已有對(duì)象進(jìn)行服務(wù),這就是 "線程池"技術(shù)產(chǎn)生的原因。
      線程池技術(shù)通過對(duì)多個(gè)任務(wù)重用線程,使線程創(chuàng)建的開銷被分?jǐn)偟蕉鄠€(gè)任 務(wù)上。其好處是,因?yàn)樵诳蛻粽?qǐng)求到達(dá)時(shí)線程已經(jīng)存在,所以消除了線程創(chuàng)建 所帶來的延遲,使應(yīng)用程序響應(yīng)更快。但目前的線程池管理技術(shù)只是維護(hù)一組工作線程和一個(gè)任務(wù)隊(duì)列,使用線 程組中的工作線程循環(huán)執(zhí)行任務(wù)隊(duì)列中的任務(wù)。采用這種線程池管理技術(shù),一 旦任務(wù)執(zhí)行過程中出現(xiàn)異常,如,線程執(zhí)行某任務(wù)的時(shí)間過長(zhǎng)或線程掛死,則 將影響應(yīng)用服務(wù)器執(zhí)行任務(wù)的效率。隨著應(yīng)用服務(wù)器不斷接受客戶請(qǐng)求進(jìn)行業(yè) 務(wù)處理,出現(xiàn)異常的幾率也會(huì)隨之增加,而目前的線程池管理技術(shù)缺乏相應(yīng)的 監(jiān)控與自恢復(fù)能力,則相應(yīng)地應(yīng)用服務(wù)器線程池中的工作線程數(shù)量會(huì)因線程掛 死而逐漸減少,執(zhí)行任務(wù)的效率也會(huì)進(jìn)一步降低。

      發(fā)明內(nèi)容
      本發(fā)明實(shí)施例提供了一種線程池管理方法及其系統(tǒng),以提高采用該種線程 池管理技術(shù)的應(yīng)用服務(wù)器的任務(wù)處理效率以及提高線程池的再生性。
      本發(fā)明實(shí)施例提供的線程池管理方法,包括以下步驟 通過定時(shí)遍歷所述線程池中各線程,監(jiān)測(cè)各線程執(zhí)行當(dāng)前任務(wù)的運(yùn)行時(shí)
      長(zhǎng);
      當(dāng)根據(jù)監(jiān)測(cè)到的運(yùn)行時(shí)長(zhǎng)確定有線程運(yùn)行超時(shí)時(shí),創(chuàng)建新的線程,并使用 新創(chuàng)建的線程執(zhí)行所述運(yùn)行超時(shí)的線程所應(yīng)執(zhí)行的任務(wù)。
      本發(fā)明實(shí)施例提供的線程池管理系統(tǒng),包括 任務(wù)隊(duì)列,用于存儲(chǔ)待處理的任務(wù); 任務(wù)執(zhí)行模塊,用于使用各線程執(zhí)行對(duì)應(yīng)的任務(wù);
      任務(wù)監(jiān)控模塊,用于通過定時(shí)遍歷所述線程池中各線程,監(jiān)測(cè)各線程執(zhí)行 當(dāng)前任務(wù)的運(yùn)行時(shí)長(zhǎng);以及,當(dāng)根據(jù)監(jiān)測(cè)到的運(yùn)行時(shí)長(zhǎng)確定有線程運(yùn)行超時(shí)時(shí), 創(chuàng)建新的線程,并指示所述任務(wù)執(zhí)行模塊使用新創(chuàng)建的線程執(zhí)行所述運(yùn)行超時(shí) 的線程所應(yīng)執(zhí)行的任務(wù)。
      本發(fā)明的上述實(shí)施例中,通過在線程執(zhí)行任務(wù)的過程中,監(jiān)測(cè)各線程當(dāng)前 執(zhí)行任務(wù)的運(yùn)行時(shí)長(zhǎng)來確定是否有線程運(yùn)行超時(shí),若有線程超時(shí),則創(chuàng)建新的 線程,并使用新創(chuàng)建的線程來執(zhí)行超時(shí)線程所應(yīng)執(zhí)行的任務(wù),從而減少了相應(yīng)任務(wù)隊(duì)列中的任務(wù)的執(zhí)行時(shí)間,并可一定程度上避免任務(wù)長(zhǎng)時(shí)間大量積壓,進(jìn) 而提高應(yīng)用服務(wù)器的運(yùn)行效率。另外,通過本發(fā)明實(shí)施例在線程池中增加的任 務(wù)監(jiān)控機(jī)制,可以及時(shí)發(fā)現(xiàn)運(yùn)行超時(shí)的線程,并及時(shí)創(chuàng)建新的任務(wù)來替代運(yùn)行 超時(shí)的線程執(zhí)行任務(wù),從而為線程池技術(shù)提供了 一種線程再生機(jī)制和容錯(cuò)機(jī) 制。


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