


下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、9C7"商學(xué)堂中國(guó)IT疲疆徒樓冼屈牌400-009-1906線程池的原理與實(shí)現(xiàn)簡(jiǎn)單介紹創(chuàng)建線程有兩種方式:繼承Thread或?qū)崿F(xiàn)Runnable。Thread實(shí)現(xiàn)了Runnable接口,提供了一個(gè)空的run()方法,所以不論是繼承Thread還是實(shí)現(xiàn)Runnable,都要有自己的run()方法。一個(gè)線程創(chuàng)建后就存在,調(diào)用start()方法就開始運(yùn)行(執(zhí)行run()方法),調(diào)用wait進(jìn)入等待或調(diào)用sleep進(jìn)入休眠期,順利運(yùn)行完畢或休眠被中斷或運(yùn)行過程中岀現(xiàn)異常而退岀。wait和sleep比較:sleep方法有:sleep(longmillis),sleep(longmillis,l
2、ongnanos),調(diào)用sleep方法后,當(dāng)前線程進(jìn)入休眠期,暫停執(zhí)行,但該線程繼續(xù)擁有監(jiān)視資源的所有權(quán)。到達(dá)休眠時(shí)間后線程將繼續(xù)執(zhí)行,直到完成。若在休眠期另一線程中斷該線程,則該線程退岀。wait方法有:wait(),wait(longtimeout),wait(longtimeout,longnanos),調(diào)用wait方法后,該線程放棄監(jiān)視資源的所有權(quán)進(jìn)入等待狀態(tài);wait():等待有其它的線程調(diào)用notify()或notifyAll()進(jìn)入調(diào)度狀態(tài),與其它線程共同爭(zhēng)奪監(jiān)視。wait()相當(dāng)于wait(0),wait(0,0)。wait(longtimeout):當(dāng)其它線程調(diào)用notify
3、()或notifyAII(),或時(shí)間到達(dá)timeout亳秒,或有其它某線程中斷該線程,則該線程進(jìn)入調(diào)度狀態(tài)。wait(longtimeout,longnanos):相當(dāng)于wait(1000000*timeout+nanos),只不過時(shí)間單位為納秒。線程池:多線程技術(shù)主要解決處理器單元內(nèi)多個(gè)線程執(zhí)行的問題,它可以顯著減少處理器單元的閑置時(shí)間,增加處理器單元的吞吐能力。假設(shè)一個(gè)服務(wù)器完成一項(xiàng)任務(wù)所需時(shí)間為:T1創(chuàng)建線程時(shí)間,T2在線程中執(zhí)行任務(wù)的時(shí)間,T3銷毀線程時(shí)間。如果:T1+T3遠(yuǎn)大于T2,則可以采用線程池,以提高服務(wù)器性能。一個(gè)線程池包括以下四個(gè)基本組成部分:1、線程池管理器(Thread
4、Pool):用于創(chuàng)建并管理線程池,包括創(chuàng)建線程池,銷毀線程池,添加新任務(wù);2、工作線程(PoolWorker):線程池中線程,在沒有任務(wù)時(shí)處于等待狀態(tài),可以循環(huán)的執(zhí)行任務(wù);3、任務(wù)接口(Task):每個(gè)任務(wù)必須實(shí)現(xiàn)的接口,以供工作線程調(diào)度任務(wù)的執(zhí)行,它主要規(guī)定了任務(wù)的入口,任務(wù)執(zhí)行完后的收尾工作,任務(wù)的執(zhí)行狀態(tài)等;4、任務(wù)隊(duì)列(taskQueue):用于存放沒有處理的任務(wù)。提供一種緩沖機(jī)制。線程池技術(shù)正是關(guān)注如何縮短或調(diào)整T1,T3時(shí)間的技術(shù),從而提高服務(wù)器程序性能的。它把T1,T3分別安排在服務(wù)器程序的啟動(dòng)和結(jié)束的時(shí)間段或者一些空閑的時(shí)間段,這樣在服務(wù)器程序處理客戶請(qǐng)求時(shí),北京尚學(xué)堂-cct
5、v央視網(wǎng)廣告合作伙伴,專業(yè)IT培訓(xùn)機(jī)構(gòu),口碑最好的java培訓(xùn)、,iOS培訓(xùn),android培訓(xùn),hadoop大數(shù)據(jù)培訓(xùn),web前端培訓(xùn)機(jī)構(gòu),0元入學(xué),先就業(yè)后付款,平均就業(yè)薪水9500以上衆(zhòng)兀學(xué)呈400-009-1906不會(huì)有T1,T3的開銷了。線程池不僅調(diào)整T1,T3產(chǎn)生的時(shí)間段,而且它還顯著減少了創(chuàng)建線程的數(shù)目,看一個(gè)例子:假設(shè)一個(gè)服務(wù)器一天要處理50000個(gè)請(qǐng)求,并且每個(gè)請(qǐng)求需要一個(gè)單獨(dú)的線程完成。在線程池中,線程數(shù)一般是固定的,所以產(chǎn)生線程總數(shù)不會(huì)超過線程池中線程的數(shù)目,而如果服務(wù)器不利用線程池來(lái)處理這些請(qǐng)求則線程總數(shù)為50000。一般線程池大小是遠(yuǎn)小于50000。所以利用線程池的服
6、務(wù)器程序不會(huì)為了創(chuàng)建50000而在處理請(qǐng)求時(shí)浪費(fèi)時(shí)間,從而提高效率。好了,廢話就到這里了,下面就是程序了,我也不講解了,注釋已經(jīng)很清晰了:/*線程池類,工作線程作為其內(nèi)部類*/packageorg.ymcn.util;importjava.util.Collections;importjava.util.Date;importjava.util.LinkedList;importjava.util.List;importorg.apache.log4j.Logger;/*線程池*創(chuàng)建線程池,銷毀線程池,添加新任務(wù)*authorobullxlpublicfinalclassThreadPoolp
7、rivatestaticLoggerlogger=Logger.getLogger(ThreadPool.class);privatestaticLoggertaskLogger=Logger.getLogger("TaskLogger");privatestaticbooleandebug=taskLogger.isDebugEnabled();/privatestaticbooleandebug=taskLogger.islnfoEnabled();/*單例*/privatestaticThreadPoolinstance=ThreadPool.getInstance(
8、);publicstaticfinalintSYSTEM_BUSY_TASK_COUNT=150;/*默認(rèn)池中線程數(shù)*/publicstaticintworker_num=5;/*已經(jīng)處理的任務(wù)數(shù)*/privatestaticinttaskCounter=0;publicstaticbooleansystemIsBusy=false;privatestaticList<Task>taskQueue=Collections.synchronizedList(newLinkedList<Task>();/*池中的所有線程*/publicPoolWorkerworkers;p
9、rivateThreadPool()workers=newPoolWorker5;for(inti=0;i<workers.length;i+)北京尚學(xué)堂-cctv央視網(wǎng)廣告合作伙伴,專業(yè)IT培訓(xùn)機(jī)構(gòu),口碑最好的java培訓(xùn)、,iOS培訓(xùn),android培訓(xùn),hadoop大數(shù)據(jù)培訓(xùn),web前端培訓(xùn)機(jī)構(gòu),0元入學(xué),先就業(yè)后付款,平均就業(yè)薪水9500以上workersi=newPoolWorker(i);privateThreadPool(intpool_worker_num)worker_num=pool_worker_num;workers=newPoolWorkerworker_num
10、;for(inti=0;i<workers.length;i+)workersi=newPoolWorker(i);publicstaticsynchronizedThreadPoolgetInstance()if(instance=null)returnnewThreadPool();returninstance;/*增加新的任務(wù)*每增加一個(gè)新任務(wù),都要喚醒任務(wù)隊(duì)列*paramnewTask*/publicvoidaddTask(TasknewTask)synchronized(taskQueue)newTask.setTaskld(+taskCounter);newTask.setS
11、ubmitTime(newDate();taskQueue.add(newTask);/*喚醒隊(duì)列,開始執(zhí)行*/taskQueue.notifyAII();("SubmitTask<"+newTask.getTaskId()+">:"+newT();/*批量增加新任務(wù)*paramtaskes*/publicvoidbatchAddTask(Tasktaskes)if(taskes=null|taskes.length=0)return;synchronized(taskQueue)for(inti=0;i
12、<taskes.length;i+)北京尚學(xué)堂-cctv央視網(wǎng)廣告合作伙伴,專業(yè)IT培訓(xùn)機(jī)構(gòu),口碑最好的java培訓(xùn)、,iOS培訓(xùn),android培訓(xùn),hadoop大數(shù)據(jù)培訓(xùn),web前端培訓(xùn)機(jī)構(gòu),0元入學(xué),先就業(yè)后付款,平均就業(yè)薪水9500以上if(taskesi=null)continue;taskesi.setTaskld(+taskCounter);taskesi.setSubmitTime(newDate();taskQueue.add(taskesi);/*喚醒隊(duì)列,開始執(zhí)行*/taskQueue.notifyAII();for(inti=0;i<taskes.lengt
13、h;i+)if(taskesi=null)continue;("SubmitTask<"+taskesi.getTaskld()+">:"+();/*線程池信息*return*/publicStringgetInfo()StringBuffersb=newStringBuffer();sb.append("nTaskQueueSize:"+taskQueue.size();for(inti=0;i<workers.length;i+)sb.append("nWo
14、rker"+i+"is"+(workersi.isWaiting()?"Waiting.":"Running.");returnsb.toString();/*銷毀線程池*/publicsynchronizedvoiddestroy()for(inti=0;i<worker_num;i+)workersi.stopWorker();workersi=null;taskQueue.clear();北京尚學(xué)堂-cctv央視網(wǎng)廣告合作伙伴,專業(yè)IT培訓(xùn)機(jī)構(gòu),口碑最好的java培訓(xùn)、,iOS培訓(xùn),android培訓(xùn),hadoo
15、p大數(shù)據(jù)培訓(xùn),web前端培訓(xùn)機(jī)構(gòu),0元入學(xué),先就業(yè)后付款,平均就業(yè)薪水9500以上眾兀學(xué)堂400-009-佃皿/*池中工作線程*authorobullxl*/privateclassPoolWorkerextendsThreadprivateintindex=-1;/*該工作線程是否有效*/privatebooleanisRunning=true;/*該工作線程是否可以執(zhí)行新任務(wù)*/privatebooleanisWaiting=true;publicPoolWorker(intindex)this.index=index;start();publicvoidstopWorker()this.
16、isRunning=false;publicbooleanisWaiting()returnthis.isWaiting;/*循環(huán)執(zhí)行任務(wù)*這也許是線程池的關(guān)鍵所在*/publicvoidrun()while(isRunning)Taskr=null;synchronized(taskQueue)while(taskQueue.isEmpty()try/*任務(wù)隊(duì)列為空,則等待有新任務(wù)加入從而被喚醒*/taskQueue.wait(20);catch(InterruptedExceptionie)logger.error(ie);/*取岀任務(wù)執(zhí)行*/r=(Task)taskQueue.remov
17、e(0);if(r!=null)isWaiting=false;北京尚學(xué)堂-cctv央視網(wǎng)廣告合作伙伴,專業(yè)IT培訓(xùn)機(jī)構(gòu),口碑最好的java培訓(xùn)、,iOS培訓(xùn),android培訓(xùn),hadoop大數(shù)據(jù)培訓(xùn),web前端培訓(xùn)機(jī)構(gòu),0元入學(xué),先就業(yè)后付款,平均就業(yè)薪水9500以上tryif(debug)r.setBeginExceuteTime(newDate();taskLogger.debug("Worker<"+index+">startexecuteTask<"+r.getTaskld()+">");if(r.
18、getBeginExceuteTime().getTime()-r.getSubmitTime().getTime()>1000)taskLogger.debug("longerwaitingtime."+()+",<"+index+">,time:"+(r.getFinishTime().getTime()-r.getBeginExceuteTime().getTime();/*該任務(wù)是否需要立即執(zhí)行*/if(r.needExecuteImmediate()newThread(r).start();el
19、ser.run();if(debug)r.setFinishTime(newDate();taskLogger.debug("Worker<"+index+">finishtask<"+r.getTaskId()+">");if(r.getFinishTime().getTime()-r.getBeginExceuteTime().getTime()>1000)taskLogger.debug("longerexecutiontime."+()+",<&qu
20、ot;+index+">,time:"+(r.getFinishTime().getTime()-r.getBeginExceuteTime().getTime();catch(Exceptione)e.printStackTrace();logger.error(e);isWaiting=true;r=null;/*任務(wù)接口類*/北京尚學(xué)堂-cctv央視網(wǎng)廣告合作伙伴,專業(yè)IT培訓(xùn)機(jī)構(gòu),口碑最好的java培訓(xùn)、,iOS培訓(xùn),android培訓(xùn),hadoop大數(shù)據(jù)培訓(xùn),web前端培訓(xùn)機(jī)構(gòu),0元入學(xué),先就業(yè)后付款,平均就業(yè)薪水9500以上packageorg.ymcn.
21、util;importjava.util.Date;*所有任務(wù)接口*其他任務(wù)必須繼承訪類*authorobullxlpublicabstractclassTaskimplementsRunnable/privatestaticLoggerlogger=Logger.getLogger(Task.class);/*產(chǎn)生時(shí)間*/privateDategenerateTime=null;/*提交執(zhí)行時(shí)間*/privateDatesubmitTime=null;/*開始執(zhí)行時(shí)間*/privateDatebeginExceuteTime=null;/*執(zhí)行完成時(shí)間*/privateDatefinishT
22、ime=null;privatelongtaskId;publicTask()this.generateTime=newDate();*任務(wù)執(zhí)行入口*/publicvoidrun()*相關(guān)執(zhí)行代碼*beginTransaction();*執(zhí)行過程中可能產(chǎn)生新的任務(wù)subtask=taskCore();* commitTransaction();* 增加新產(chǎn)生的任務(wù)ThreadPool.getInstance().batchAddTask(taskCore();*/*所有任務(wù)的核心所以特別的業(yè)務(wù)邏輯執(zhí)行之處*throwsExceptionpublicabstractTasktaskCore()throwsException;/*是否用到數(shù)據(jù)庫(kù)*returnprotectedabstractbooleanuseDb();/*是否需要立即執(zhí)行*returnprotectedabstractbooleanneedExecutelmmediate();/*北京尚學(xué)堂-cctv央視網(wǎng)廣告合作伙伴,專業(yè)IT培訓(xùn)機(jī)構(gòu),
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年人工智能輔助醫(yī)療診斷產(chǎn)品注冊(cè)審批法規(guī)動(dòng)態(tài)及應(yīng)對(duì)策略報(bào)告
- 2025年城市更新項(xiàng)目歷史文化街區(qū)保護(hù)與特色街區(qū)建設(shè)研究報(bào)告
- 新能源汽車制造2025:核心技術(shù)與產(chǎn)業(yè)布局新能源汽車產(chǎn)業(yè)鏈投資機(jī)會(huì)報(bào)告
- 2025年醫(yī)院電子病歷系統(tǒng)優(yōu)化在醫(yī)院信息化建設(shè)中的數(shù)據(jù)生命周期管理報(bào)告
- 2025年醫(yī)院電子病歷系統(tǒng)優(yōu)化構(gòu)建醫(yī)療信息化生態(tài)圈報(bào)告
- 2025年醫(yī)藥市場(chǎng)醫(yī)藥政策法規(guī)變化:仿制藥一致性評(píng)價(jià)下的市場(chǎng)適應(yīng)性報(bào)告
- 2025年醫(yī)藥企業(yè)研發(fā)外包(CRO)模式下的臨床試驗(yàn)數(shù)據(jù)挖掘與知識(shí)產(chǎn)權(quán)保護(hù)
- 零售企業(yè)私域流量運(yùn)營(yíng)實(shí)踐:2025年消費(fèi)者洞察與場(chǎng)景化營(yíng)銷報(bào)告
- 八年級(jí)期末家長(zhǎng)會(huì)教學(xué)課件
- 2025年海上風(fēng)能資源評(píng)估與深遠(yuǎn)海風(fēng)電發(fā)展規(guī)劃報(bào)告:深遠(yuǎn)海風(fēng)電場(chǎng)海上風(fēng)電場(chǎng)運(yùn)維產(chǎn)業(yè)生態(tài)
- 2025年云南南方地勘工程有限公司招聘筆試參考題庫(kù)含答案解析
- 2025年6月英語(yǔ)四級(jí)真題及參考答案
- 浙江省2024-2025學(xué)年高二下學(xué)期數(shù)學(xué)學(xué)考模擬考(三)(含答案)
- 杭州市富陽(yáng)區(qū)衛(wèi)健系統(tǒng)事業(yè)單位招聘筆試真題2024
- 2023-2024學(xué)年貴州省黔南州都勻市統(tǒng)編版三年級(jí)下冊(cè)期末考試語(yǔ)文試卷
- 2025鋼管租賃合同樣本
- 2024年福建省廈門市思明區(qū)初中畢業(yè)班適應(yīng)性練習(xí)(二)地理試卷
- 電大:理論聯(lián)系實(shí)際談一談如何維護(hù)政治安全?參考答案
- 醫(yī)學(xué)多學(xué)科診療制度
- 游泳救生員勞務(wù)合同協(xié)議
- 國(guó)家開放大學(xué)2025春《公共部門人力資源管理》形考任務(wù)1-4參考答案
評(píng)論
0/150
提交評(píng)論