FutureTask源碼詳解(JDK1.7)

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)是否完成。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容