1. FutureTask
FutureTask實(shí)現(xiàn)了Runnable和Future接口,它主要用于包裝真實(shí)callable或runnable的task吱雏,其run方法內(nèi)運(yùn)行包裝的task务甥,同時實(shí)現(xiàn)的Future接口可獲取包裝的task的結(jié)果举哟。
在JUC提供的線程池實(shí)現(xiàn)中俯渤,submit方法提交callable或runnable任務(wù)僧界,返回future用于異步獲取任務(wù)結(jié)果侨嘀,實(shí)際實(shí)現(xiàn)就是將任務(wù)包裝成FutureTask,然后返回捎泻。
下圖是FutureTask的狀態(tài)變遷飒炎。
FutureTask.png
其中圓圈表示用于表示FutureTask的狀態(tài),一開始的狀態(tài)為New笆豁,進(jìn)入紅色狀態(tài)表示此時調(diào)用get會立即返回(Normal則task正常結(jié)束返回結(jié)果郎汪,Exceptional表示任務(wù)異常結(jié)束,Interupting和Interuptted表示任務(wù)取消了)闯狱。
無論任何方式結(jié)束煞赢,F(xiàn)utureTask結(jié)束時都會調(diào)用finishCompletion
喚醒所有因?yàn)檎{(diào)用get
阻塞的線程,然后調(diào)用done
.
done
方法是一個空方法哄孤,用于可以繼承FutureTask實(shí)現(xiàn)done方法用于在任務(wù)結(jié)束時做一些處理照筑。比如:
- guava的
ListenableFutureTask
能夠在任務(wù)結(jié)束時調(diào)用listener從而實(shí)現(xiàn)異步非阻塞方式獲取結(jié)果,這里listener的執(zhí)行就是通過實(shí)現(xiàn)FutureTask # done在其中調(diào)用listener實(shí)現(xiàn)的。