(文章本人原創(chuàng),若轉(zhuǎn)載請(qǐng)注明出處)
在JDK1.5提供了一個(gè)線程池ThreadPoolExecutor,可以處理用戶(hù)提交過(guò)來(lái)的線程。如果把要處理的任務(wù)比作蓋一個(gè)大樓,那么每一個(gè)建筑工人就相當(dāng)于一個(gè)線程,那么這個(gè)ThreadPoolExecutor就好像包工頭,它來(lái)控制蓋這個(gè)大樓需要多少個(gè)工人,何時(shí)招進(jìn)新工人,何時(shí)辭退已經(jīng)長(zhǎng)時(shí)間沒(méi)有事做的工人,等等此類(lèi)事務(wù)。也就是說(shuō)用戶(hù)程序不斷提交新的線程,ThreadPoolExecutor執(zhí)行提交線程的同時(shí)會(huì)控制目前總共同時(shí)執(zhí)行的線程數(shù),銷(xiāo)毀已執(zhí)行完閑置的線程等控制行為,保留最少閑置線程數(shù),并且可以配置不同的處理策略。
為什么要使用線程池呢,這與數(shù)據(jù)庫(kù)連接池的原理有點(diǎn)相仿,線程的創(chuàng)建是需要成本的,包括服務(wù)器CPU和內(nèi)存資源,由于多線程是并行運(yùn)行,程序運(yùn)行過(guò)程中可能有的線程已經(jīng)完成自身處理任務(wù),處于閑置狀態(tài),如果在這種情況下再不斷創(chuàng)建新任務(wù)就是在浪費(fèi)服務(wù)器資源,此時(shí)應(yīng)該盡量使用先前創(chuàng)建的好的并且是處理閑置狀態(tài)的線程來(lái)處理新任務(wù),而線程池就可以有效的對(duì)此進(jìn)行自動(dòng)化管理,當(dāng)然這個(gè)管理是可以由用戶(hù)配置的。
ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
這是線程池的構(gòu)建器,用戶(hù)程序通過(guò)這個(gè)構(gòu)建器傳參數(shù),corePoolSize是線程池中核心線程數(shù),運(yùn)行的線程數(shù)不能少于這個(gè)核心線程數(shù),否則就新建線程。maximumPoolSize是充許最大的線程數(shù)。keepAliveTime設(shè)置除核心線程外其它線程的空閑時(shí)間,超過(guò)這個(gè)時(shí)間線程就自動(dòng)終止。unit是指的keepAliveTime的時(shí)間單位。BlockingQueue接口按生產(chǎn)則消費(fèi)者算法設(shè)計(jì)的一個(gè)線程池內(nèi)部處理線程隊(duì)列的接口,有三種實(shí)現(xiàn)SynchronousQueue、LinkedBlockingQueue和ArrayBlockingQueue,在實(shí)際運(yùn)行程序時(shí)可以根據(jù)這三種實(shí)現(xiàn)得到不同的性能,比如有的實(shí)現(xiàn)可能在有新任務(wù)來(lái)時(shí)不新建線程,而是將其加入等待隊(duì)列,等有線程運(yùn)行完時(shí)再分配給其使用。具體實(shí)現(xiàn)還是參看它們的JDK文檔吧,這里站在使用的角度它們是可以調(diào)整運(yùn)行性能的開(kāi)關(guān)。當(dāng)最大線程和工作隊(duì)列容量都達(dá)到最大值時(shí),再提交給線程池新任務(wù)就會(huì)被拒絕,此時(shí)線程池會(huì)調(diào)用RejectedExecutionHandler 接口進(jìn)行處理,具體實(shí)現(xiàn)有四種策略。我們只需要選用其中一種在構(gòu)建ThreadPoolExecutor時(shí)傳入即可。具體四種實(shí)現(xiàn)還是參看JDK文檔吧。關(guān)于ThreadPoolExecutor的JDK文檔。至此控制線程池運(yùn)作的幾個(gè)參數(shù)都從構(gòu)建器中傳入了。
posted on 2009-03-19 22:26
依然Fantasy 閱讀(846)
評(píng)論(0) 編輯 收藏