資源描述:
《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(poolsizc7、,因此不難猜測FutureTask也是實(shí)現(xiàn)了Runnable接口的publicclassFutureTaskimplementsRunndbleFuture〈V>{/**SynchronizationcontrolforFutureTask*/publicinterfaceRunnableFutureextendsRunnable,Future{???/**????*SetsthisFuturetotheresultofitscomputation????*unlessithasbeencancelled.????*/?
8、??voidrun();FutureTask的run()方法i
9、【是這么寫:publicvoidrun(){sync,inncrRun();innerRun方法先使用原子方式更改了一下自己的一