futuretask源碼解析-java開發(fā)java經(jīng)驗(yàn)技巧

futuretask源碼解析-java開發(fā)java經(jīng)驗(yàn)技巧

ID:30778903

大?。?1.00 KB

頁數(shù):12頁

時(shí)間:2019-01-03

futuretask源碼解析-java開發(fā)java經(jīng)驗(yàn)技巧_第1頁
futuretask源碼解析-java開發(fā)java經(jīng)驗(yàn)技巧_第2頁
futuretask源碼解析-java開發(fā)java經(jīng)驗(yàn)技巧_第3頁
futuretask源碼解析-java開發(fā)java經(jīng)驗(yàn)技巧_第4頁
futuretask源碼解析-java開發(fā)java經(jīng)驗(yàn)技巧_第5頁
資源描述:

《futuretask源碼解析-java開發(fā)java經(jīng)驗(yàn)技巧》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。

1、FuturcTask源碼解析-Java開發(fā)Java經(jīng)驗(yàn)技巧FutureTask源碼解析原文出處:Jd劉鉗洋站在使用者的角度,future是一個(gè)經(jīng)常在多線程環(huán)境下使用的Runnable,使用它的好處有兩個(gè):1.線程執(zhí)行結(jié)果帶有返I叫值2.提供了一個(gè)線程超時(shí)的功能,超過超時(shí)時(shí)間拋出界常后返回。那,怎么實(shí)現(xiàn)future這種超時(shí)控制呢?來看看代碼:publicclassFutureTaskimplementsRunnableFuture{/**SynchronizationcontrolforFuturcTask*/privatefi

2、nalSyncsync;FutureTask的實(shí)現(xiàn)只是依賴了一個(gè)內(nèi)部類Sync實(shí)現(xiàn)的,Sync是AQS(AbstractQueuedSynchronizer)的子類,這個(gè)類承擔(dān)了所有future的功能,AbstractQueuedSynchronizer的作者是大名鼎鼎的并發(fā)編程大師DougLea,它的作用遠(yuǎn)遠(yuǎn)不止實(shí)現(xiàn)一個(gè)Future這么簡單,后面在說。下面,我們從一個(gè)future提交到線程池開始,直到future超時(shí)或者執(zhí)行結(jié)束來看看future都做了些什么。怎么做的。首先,向線程池ThreadPoolExecutor提交一個(gè)futur

3、e:future二exec,submit(newWebDivideFuture(cookieUti1s,jediusUti1,request,sclcctFactory,result,tcstlnfos));ThreadPoolExecutor將提交的任務(wù)用FutureTask包裝一下:publicFuturesubmit(Callabletask){if(task二二null)thrownewNullPointerException();RunnableFutureftask二newTaskFor(task);e

4、xecute(ftask);returnftask;}protectedRunnableFuturenewTaskFor(Callablecallable){returnnewFuturcTask(callable);然后嘗試將包裝后的Future用Thread類包裝下后啟動(dòng),紅色標(biāo)記的地方表示,當(dāng)當(dāng)前線程池的大小小于corePoolSize時(shí),將任務(wù)捉交,否則將該任務(wù)加入到workQueue中去,如果workQueue裝滿了,則嘗試在線程數(shù)小于MaxPoolSize的條件下提交該任務(wù)。順便說明下,我們使用線程池時(shí)

5、,常常看到有關(guān)有界隊(duì)列,無界隊(duì)列作為工作隊(duì)列的字眼:使用無界隊(duì)列時(shí),線程池的大小永遠(yuǎn)不大于corePoolSize,使用有界隊(duì)列時(shí)的maxPoolSize才有效,原因就在這里,如果是無界隊(duì)列,紅框中的add永遠(yuǎn)為true下方的addlfUnderMaximumPoolSize怎么也走不到了,也就不會(huì)有線程數(shù)量大于MaxPoolSize的情況。言歸正傳,看看add!FUnderCorePoolSize中做了什么事:new了一個(gè)Thread,將我們提交的任務(wù)包裝下后就直接啟動(dòng)了privateboolcanaddlfUndcrCorcPoolS

6、izc(RunnablefirstTask){Threadt=null;finalReentrantLockmainLock=this.mainLock;mainLock,lock();try{if(poolsizc

7、,因此不難猜測FutureTask也是實(shí)現(xiàn)了Runnable接口的publicclassFutureTaskimplementsRunndbleFuture〈V>{/**SynchronizationcontrolforFutureTask*/publicinterfaceRunnableFutureextendsRunnable,Future{???/**????*SetsthisFuturetotheresultofitscomputation????*unlessithasbeencancelled.????*/?

8、??voidrun();FutureTask的run()方法i

9、【是這么寫:publicvoidrun(){sync,inncrRun();innerRun方法先使用原子方式更改了一下自己的一

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。