FutureTask常常用于包裝任務(wù),提交給Executor執(zhí)行,本博客介紹JDK1.7的實(shí)現(xiàn),如果想看JDK1.8的實(shí)現(xiàn)請(qǐng)移步FutureTask源碼詳解(JDK1.8)
繼承結(jié)構(gòu)

實(shí)現(xiàn)
FutureTask對(duì)外方法
FutureTask對(duì)外方法都通過內(nèi)部類Sync來實(shí)現(xiàn)
Sync內(nèi)部類實(shí)現(xiàn)





總結(jié)
通過內(nèi)部繼承AQS的一個(gè)私有類Sync來實(shí)現(xiàn)操作代理的;Sync 實(shí)現(xiàn)了AQS的tryAcquireShared()和tryReleaseShared()方法
FutureTask代的get()方法代理到AQS的acquireSharedInterruptibly()方法上
這個(gè)方法內(nèi)部回調(diào)重寫的tryAcquireShared()方法來判斷acquire操作是否可以成功。
- 成功的條件為:state為執(zhí)行完成狀態(tài)RAN或已取消CANCELLED,且runner不為null。
- 如果成功則從get()方法返回,失敗則進(jìn)入AQS等待隊(duì)列中,直到其他線程release(run,cancel)。
- 當(dāng)其他線程執(zhí)行AQS的release方法喚醒當(dāng)前線程后,當(dāng)前線程再次執(zhí)行tryAcquireShared()方法將返回1(大于0的數(shù)表示成功),當(dāng)前線程離開等待隊(duì)列并喚醒后繼線程(級(jí)聯(lián)喚醒的效果)。
- 最后返回計(jì)算的結(jié)果或者拋出異常。
FutureTask的run()和cancel()方法代理到AQS的release()方法上
release()會(huì)回調(diào)tryReleaseShared()方法,看一下run方法的執(zhí)行過程:
- 執(zhí)行任務(wù)(Callable.call());
- 以原子的方式更新同步狀態(tài),如果這個(gè)操作成功就設(shè)置代表計(jì)算結(jié)果的變量result的值為Callable.call()的返回值,然后調(diào)用AQS的releaseShared()方法釋放同步狀態(tài)
- 先回調(diào)tryReleaseShared()方法,設(shè)置運(yùn)行任務(wù)的線程為null,然后返回true。
- 然后執(zhí)行AQS.releaseShared()方法,喚醒線程等待隊(duì)列中的第一個(gè)線程(第一個(gè)被喚醒后,后面依次被喚醒)
- 執(zhí)行FutureTask.done()方法,這是一個(gè)空方法??梢杂脕碓谶@個(gè)方法內(nèi)查詢狀態(tài)是否完成。

