霍永華 曹毅 劉文 李文
(1 中國(guó)電子科技集團(tuán)公司第五十四研究所河北石家莊 050081)
(2 總參信息化部駐石家莊地區(qū)軍代室河北石家莊 050081)
(3 信息化部檔案館北京 100000)
(4 中國(guó)電子系統(tǒng)設(shè)備工程公司研究所北京 100000)
線程池技術(shù)在B/S網(wǎng)絡(luò)管理軟件架構(gòu)中的應(yīng)用
霍永華1曹毅2劉文3李文4
(1 中國(guó)電子科技集團(tuán)公司第五十四研究所河北石家莊 050081)
(2 總參信息化部駐石家莊地區(qū)軍代室河北石家莊 050081)
(3 信息化部檔案館北京 100000)
(4 中國(guó)電子系統(tǒng)設(shè)備工程公司研究所北京 100000)
針對(duì)網(wǎng)絡(luò)管理軟件后臺(tái)存在應(yīng)用服務(wù)器的數(shù)據(jù)處理量多和資源消耗過(guò)大的問(wèn)題,提出了改進(jìn)算法,研究了線程池技術(shù),包括線程池的工作原理、線程池使用方式、線程池配置方法、線程池監(jiān)控方法和線程池的關(guān)閉方法。線程池根據(jù)基本線程池、工作隊(duì)列和整個(gè)線程池的飽和情況進(jìn)行工作,依據(jù)任務(wù)性質(zhì)、任務(wù)優(yōu)先級(jí)、任務(wù)執(zhí)行時(shí)間和任務(wù)依賴(lài)性進(jìn)行線程配置,以達(dá)到高效執(zhí)行和最優(yōu)資源的利用。
線程池 工作隊(duì)列 任務(wù)隊(duì)列 任務(wù)優(yōu)先級(jí)
合理利用線程池能夠帶來(lái)3個(gè)好處:①降低資源消耗:通過(guò)重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷(xiāo)毀造成的資源消耗;②提高響應(yīng)速度:當(dāng)任務(wù)到達(dá)時(shí),任務(wù)可以不需要等到線程創(chuàng)建就能立即執(zhí)行;③提高線程的可管理性:線程是稀缺資源,如果無(wú)限制的創(chuàng)建,不僅會(huì)消耗系統(tǒng)資源,還會(huì)降低系統(tǒng)的穩(wěn)定性,使用線程池可以進(jìn)行統(tǒng)一的分配,調(diào)優(yōu)和監(jiān)控系統(tǒng)資源。
2.1 線程池工作原理
線程池工作原理如圖1所示。
圖1 線程池工作原理圖
線程池工作原理[1]如下:
①線程池判斷基本線程池是否已滿(mǎn),若已滿(mǎn),則創(chuàng)建一個(gè)工作線程來(lái)執(zhí)行任務(wù);否則,轉(zhuǎn)入步驟②;
②線程池判斷工作隊(duì)列是否已滿(mǎn),若已滿(mǎn),則將新提交的任務(wù)存儲(chǔ)在工作隊(duì)列中;否則,轉(zhuǎn)入步驟③;
③最后線程池判斷整個(gè)線程池是否已滿(mǎn),若已滿(mǎn),則創(chuàng)建一個(gè)新的工作線程來(lái)執(zhí)行任務(wù);否則,交給飽和策略來(lái)處理這個(gè)任務(wù)。
2.2 線程池使用
但是要做到合理的利用線程池,必須了解線程池的使用方法和配置方法。創(chuàng)建一個(gè)線程池需要輸入幾個(gè)參數(shù)[2]:
①線程池的基本大?。╟orePoolSize):當(dāng)提交一個(gè)任務(wù)到線程池時(shí),線程池會(huì)創(chuàng)建一個(gè)線程來(lái)執(zhí)行任務(wù),即使其他空閑的基本線程能夠執(zhí)行新任務(wù)也會(huì)創(chuàng)建線程,等到需要執(zhí)行的任務(wù)數(shù)大于線程池基本大小時(shí)就不再創(chuàng)建。如果調(diào)用了線程池的prestartAllCoreThreads方法,線程池會(huì)提前創(chuàng)建并啟動(dòng)所有基本線程;
②任務(wù)隊(duì)列(runnableTaskQueue):用于保存等待執(zhí)行的任務(wù)的阻塞隊(duì)列??梢赃x擇以下幾個(gè)阻塞隊(duì)列,阻塞隊(duì)列名稱(chēng)及含義如表1所示;
③線程池最大大?。╩aximumPoolSize):線程池允許創(chuàng)建的最大線程數(shù)。如果隊(duì)列滿(mǎn)了,并且已創(chuàng)建的線程數(shù)小于最大線程數(shù),則線程池會(huì)再創(chuàng)建新的線程執(zhí)行任務(wù)。值得注意的是如果使用了無(wú)界的任務(wù)隊(duì)列這個(gè)參數(shù)就沒(méi)什么效果;
④ThreadFactory:用于設(shè)置創(chuàng)建線程的工廠,可以通過(guò)線程工廠給每個(gè)創(chuàng)建出來(lái)的線程設(shè)置更有意義的名字;
表1 阻塞隊(duì)列名稱(chēng)及含義
⑤飽和策略(RejectedExecutionHandler):當(dāng)隊(duì)列和線程池都滿(mǎn)了,說(shuō)明線程池處于飽和狀態(tài),那么必須采取一種策略處理提交的新任務(wù)。這個(gè)策略默認(rèn)情況下是AbortPolicy,表示無(wú)法處理新任務(wù)時(shí)拋出異常,JDK1.5提供的4種策略如表2所示;
表2 飽和策略說(shuō)明
⑥keepAliveTime(線程活動(dòng)保持時(shí)間):線程池的工作線程空閑后,保持存活的時(shí)間,所以如果任務(wù)很多,并且每個(gè)任務(wù)執(zhí)行的時(shí)間比較短,可以調(diào)大這個(gè)時(shí)間,提高線程的利用率;
⑦TimeUnit(線程活動(dòng)保持時(shí)間的單位):可選的單位有天、小時(shí)、分鐘、毫秒、微秒和毫微秒。
2.3 線程池配置
要想合理的配置線程池[3],就必須首先分析任務(wù)特性,可以從以下幾個(gè)角度來(lái)進(jìn)行分析:①任務(wù)的性質(zhì):CPU密集型任務(wù),IO密集型任務(wù)和混合型任務(wù);②任務(wù)的優(yōu)先級(jí):高、中和低;③任務(wù)的執(zhí)行時(shí)間:長(zhǎng)、中和短;④任務(wù)的依賴(lài)性:是否依賴(lài)其他系統(tǒng)資源,如數(shù)據(jù)庫(kù)連接。可以根據(jù)任務(wù)性質(zhì)的不同,配置不同規(guī)模的線程池予以處理:
①CPU密集型任務(wù):配置盡可能小的線程,如配置Ncpu+1個(gè)線程的線程池;
②IO密集型任務(wù):由于線程并不是一直在執(zhí)行任務(wù),則配置盡可能多的線程,如2?Ncpu;
③混合型的任務(wù),如果可以拆分,則將其拆分成一個(gè)CPU密集型任務(wù)和一個(gè)IO密集型任務(wù),只要這2個(gè)任務(wù)執(zhí)行的時(shí)間相差不是太大,那么分解后執(zhí)行的吞吐率要高于串行執(zhí)行的吞吐率,如果這2個(gè)任務(wù)執(zhí)行時(shí)間相差太大,則沒(méi)必要進(jìn)行分解??梢酝ㄟ^(guò)Runtime.getRuntime(),availableProcessors()方法獲得當(dāng)前設(shè)備的CPU個(gè)數(shù);
④優(yōu)先級(jí)不同的任務(wù):可以使用優(yōu)先級(jí)隊(duì)列PriorityBlockingQueue來(lái)處理,可以讓優(yōu)先級(jí)高的任務(wù)先得到執(zhí)行,需要注意的是如果一直有優(yōu)先級(jí)高的任務(wù)提交到隊(duì)列里,那么優(yōu)先級(jí)低的任務(wù)可能永遠(yuǎn)不能執(zhí)行;
⑤執(zhí)行時(shí)間不同的任務(wù):可以交給不同規(guī)模的線程池來(lái)處理,或者也可以使用優(yōu)先級(jí)隊(duì)列,讓執(zhí)行時(shí)間短的任務(wù)先執(zhí)行;
⑥依賴(lài)數(shù)據(jù)庫(kù)連接池的任務(wù),因?yàn)榫€程提交SQL后需要等待數(shù)據(jù)庫(kù)返回結(jié)果,等待的時(shí)間越長(zhǎng),CPU空閑時(shí)間就越長(zhǎng),那么線程數(shù)應(yīng)該設(shè)置越大,這樣才能更好的利用CPU。
建議使用有界隊(duì)列,有界隊(duì)列能增加系統(tǒng)的穩(wěn)定性和預(yù)警能力,可以根據(jù)需要設(shè)大一點(diǎn),比如幾千。有一次使用的后臺(tái)任務(wù)線程池的隊(duì)列和線程池全滿(mǎn)了,不斷地出現(xiàn)拋棄任務(wù)的異常,通過(guò)排查發(fā)現(xiàn)是數(shù)據(jù)庫(kù)出現(xiàn)了問(wèn)題,導(dǎo)致執(zhí)行SQL變得非常緩慢,因?yàn)楹笈_(tái)任務(wù)線程池里的任務(wù)全是需要向數(shù)據(jù)庫(kù)查詢(xún)和插入數(shù)據(jù)的,所以導(dǎo)致線程池里的工作線程全部阻塞,任務(wù)積壓在線程池里。如果當(dāng)時(shí)設(shè)置成無(wú)界隊(duì)列,線程池的隊(duì)列就會(huì)越來(lái)越多,有可能會(huì)撐滿(mǎn)內(nèi)存,導(dǎo)致整個(gè)系統(tǒng)不可用,而不只是后臺(tái)任務(wù)出現(xiàn)問(wèn)題。當(dāng)然系統(tǒng)所有的任務(wù)是用的單獨(dú)的服務(wù)器部署的,而使用不同規(guī)模的線程池跑不同類(lèi)型的任務(wù),但是出現(xiàn)這樣問(wèn)題時(shí)也會(huì)影響到其他任務(wù)。
2.4 線程池監(jiān)控
通過(guò)線程池提供的參數(shù)進(jìn)行監(jiān)控。線程池里有一些屬性在監(jiān)控線程池的時(shí)候可以使用:
①askCount:線程池需要執(zhí)行的任務(wù)數(shù)量;
②completedTaskCount:線程池在運(yùn)行過(guò)程中已完成的任務(wù)數(shù)量。小于或等于taskCount;
③largestPoolSize:線程池曾經(jīng)創(chuàng)建過(guò)的最大線程數(shù)量。通過(guò)這個(gè)數(shù)據(jù)可以知道線程池是否滿(mǎn)過(guò)。如等于線程池的最大大小,則表示線程池曾經(jīng)滿(mǎn)了;
④getPoolSize:線程池的線程數(shù)量。如果線程池不銷(xiāo)毀的話,池里的線程不會(huì)自動(dòng)銷(xiāo)毀,所以這個(gè)大小只增不減,getActiveCount:獲取活動(dòng)的線程數(shù)。
通過(guò)擴(kuò)展線程池進(jìn)行監(jiān)控。通過(guò)繼承線程池并重寫(xiě)線程池的beforeExecute,afterExecute和terminated方法,可以在任務(wù)執(zhí)行前,執(zhí)行后和線程池關(guān)閉前干一些事情。如監(jiān)控任務(wù)的平均執(zhí)行時(shí)間、最大執(zhí)行時(shí)間和最小執(zhí)行時(shí)間等,這幾個(gè)方法在線程池里是空方法。
2.5 線程池關(guān)閉
可以通過(guò)調(diào)用線程池的shutdown或shutdownNow方法來(lái)關(guān)閉線程池,他們的原理是遍歷線程池中的工作線程,然后逐個(gè)調(diào)用線程的interrupt方法來(lái)中斷線程,所以無(wú)法響應(yīng)中斷的任務(wù)可能永遠(yuǎn)無(wú)法終止。但是他們存在一定的區(qū)別,shutdownNow首先將線程池的狀態(tài)設(shè)置成STOP,然后嘗試停止所有的正在執(zhí)行或暫停任務(wù)的線程,并返回等待執(zhí)行任務(wù)的列表,而shutdown只是將線程池的狀態(tài)設(shè)置成SHUTDOWN狀態(tài),然后中斷所有沒(méi)有正在執(zhí)行任務(wù)的線程。
只要調(diào)用了這2個(gè)關(guān)閉方法的其中一個(gè),isShutdown方法就會(huì)返回true。當(dāng)所有的任務(wù)都已關(guān)閉后,才表示線程池關(guān)閉成功,這時(shí)調(diào)用isTerminaed方法會(huì)返回true。至于應(yīng)該調(diào)用哪一種方法來(lái)關(guān)閉線程池,應(yīng)該由提交到線程池的任務(wù)特性決定,通常調(diào)用shutdown來(lái)關(guān)閉線程池,如果任務(wù)不一定要執(zhí)行完,則可以調(diào)用shutdownNow。
在某網(wǎng)管項(xiàng)目中,基于B/S網(wǎng)管軟件架構(gòu)[4-6]。由于被管對(duì)象種類(lèi)多參數(shù)量非常大,且通常有多個(gè)客戶(hù)端同時(shí)訪問(wèn)服務(wù)器,并發(fā)操作多。在未使用線程池時(shí),經(jīng)常會(huì)發(fā)生操作請(qǐng)求緩慢和死機(jī)現(xiàn)象。采用線程池后,在AS應(yīng)用服務(wù)器中,針對(duì)拓?fù)涔芾?、告警管理、性能管理、SNMP通信機(jī)和專(zhuān)用協(xié)議通信機(jī)等模塊,根據(jù)功能模塊的不同、功能優(yōu)先級(jí)、執(zhí)行頻率和執(zhí)行時(shí)間等,基于配置文件進(jìn)行線程池的靈活配置,包括線程池的基本大小、最大大小和執(zhí)行時(shí)間等,使用不同規(guī)模的線程池運(yùn)行不同類(lèi)型的任務(wù)。通過(guò)應(yīng)用線程池,大大提高了應(yīng)用服務(wù)器的數(shù)據(jù)處理效率,提高了操作響應(yīng)速度,避免了死機(jī)現(xiàn)象的發(fā)生。
針對(duì)該項(xiàng)目被管對(duì)象多和參數(shù)多的特點(diǎn),需要定時(shí)輪詢(xún)?cè)诰W(wǎng)設(shè)備的狀態(tài)和各項(xiàng)參數(shù),因此對(duì)拓?fù)涔芾?、故障管理和性能管理功能模塊配置了線程池和執(zhí)行優(yōu)先級(jí)。拓?fù)涔芾硪〞r(shí)輪詢(xún)?cè)O(shè)備狀態(tài),告警管理要查詢(xún)重要設(shè)備參數(shù)的運(yùn)行情況,性能管理輪詢(xún)重要性能參數(shù)值,以進(jìn)行越限處理。配置文件內(nèi)容如下:
在基于B/S的網(wǎng)絡(luò)管理軟件體系架構(gòu)中,由于AS應(yīng)用服務(wù)器需要處理所有的與被管對(duì)象相關(guān)的數(shù)據(jù)采集、數(shù)據(jù)處理、數(shù)據(jù)上報(bào)和數(shù)據(jù)存儲(chǔ),同時(shí)還要完成與前臺(tái)頁(yè)面的數(shù)據(jù)請(qǐng)求和數(shù)據(jù)交互,尤其是當(dāng)被管對(duì)象種類(lèi)多且參數(shù)量大時(shí),AS應(yīng)用服務(wù)器需要頻繁處理大量數(shù)據(jù),因此處理效率和系統(tǒng)資源消耗都非常大。線程池技術(shù)是一種很好的解決此類(lèi)問(wèn)題的技術(shù),線程池技術(shù)的應(yīng)用對(duì)于提高軟件運(yùn)行效率,節(jié)省系統(tǒng)資源有很大幫助。事實(shí)證明,線程池技術(shù)在基于B/S架構(gòu)的網(wǎng)絡(luò)管理軟件的AS應(yīng)用服務(wù)器中的應(yīng)用中達(dá)到了高效率和低消耗的目的。
[1]LENNSELIUS B,RYDSTROM.Software Fault Content and Reliability Estimations for Telecommunications System[J]. IEEE Trans.Selected Areas in Communications,1990,8(2): 262-271.
[2]DOWNS T,SCOTT A.Evaluating the Performance Id Software Reliability Models[J].Reliability,IEEE Transactions on,1992,41(4):12-16.
[3]ZAHEDI F,ASHRAFI N.Software Reliability Allocation Based on Structure Utility,Price and Cost[J].Software Engineering,IEEE Transactions on,1991,17(21):345-356.
[4]張楠,邱雪松.基于Web服務(wù)的電信網(wǎng)絡(luò)管理架構(gòu)研究和實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用研究,2008(6):1882-1885.
[5]馬俊,丁曉明.基于SOA的異構(gòu)系統(tǒng)集成研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2008(7):3638-3641.
[6]譚永明,蘇斌.面向服務(wù)架構(gòu)體系的研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2007(3):132-134.
Application of Thread Pool Technology in B/S Network Management Software Architecture
HUO Yong-hua1CAO Yi2LIU Wen3LI Wen4
(1 The 54th Research Institute of CETC,Shijiazhuang Hebei 050081,China)
(2 Military Representative Office of Information Technology Department of PLA General Staff Headquarters Stationed in Shijiazhuang Region,Shijiazhuang Hebei 050081,China)
(3 The Archives of Ministry of Industry and Information Technology,Beijing 100000,China)
(4 Institute of China Electronics System Engineering Company,Beijing 100000,China)
Aiming at the problems of large data processing capacity and excessive resource consumption of application server existing in the background of network management software,this paper proposes an improved algorithm and studies such thread pool technology as operational principle,usage mode,configuration method,monitoring method and shutdown method of thread pool.The thread pool works according to the saturation situation of basic thread pool,work queue and whole tread pool.The thread configuration is carried out according to task nature,priority,execution time and interdependence,in order to achieve the efficient implementation and the optimal usage of resources.
thread pool;work queue;task queue;task priority
TP393
A
1008-1739(2014)06-54-49-4
定稿日期:2014-02-26