FutureTask類實(shí)現(xiàn)了RunnableFuture接口,
而RunnableFuture繼承了Runnable和Future,
也就是說FutureTask既是Runnable寿冕,也是Future唐础。
因此FuntureTask可以直接作為Thread的構(gòu)造參數(shù)直接使用了彤枢。
Callable接口
@FunctionalInterfacepublicinterfaceCallable{Vcall()throwsException;}
Callable接口類似于Runnable惨篱,都是為了成為其它線程的執(zhí)行單元而被設(shè)計(jì)出來的,但與Runnable不同的是收厨,Callable接口不僅擁有返回值晋柱,還會(huì)拋出異常。
Future接口
Future表示的是異步計(jì)算的結(jié)果诵叁,在Future接口中雁竞,提供了一些用于檢查任務(wù)執(zhí)行是否完成,等待任務(wù)執(zhí)行完成和取出任務(wù)執(zhí)行結(jié)果的方法拧额。
當(dāng)運(yùn)算完成后只能通過get()方法進(jìn)行檢索碑诉,并且調(diào)用了get()方法后出阻塞當(dāng)前線程直到任務(wù)執(zhí)行完成。
通過cancel()方法侥锦,可以取消任務(wù)进栽。
通過isCancelled()方法,可以判斷任務(wù)是否被取消了
通過isDone()方法恭垦,可以判斷任務(wù)是否已經(jīng)完成了
RunnableFuture接口
RunnableFuture 繼承自Runnable和Future快毛,即提供了可以使用Runnable來執(zhí)行任務(wù),又可以使用Future執(zhí)行獲取結(jié)果的功能番挺,同時(shí)還擁有了取消任務(wù)唠帝,判斷任務(wù)狀態(tài)的功能
FutureTask
一個(gè)異步可取消計(jì)算,F(xiàn)utureTask提供了Future接口的基本實(shí)現(xiàn)玄柏,其中包含開始執(zhí)行任務(wù)和結(jié)束任務(wù)的方法襟衰,查詢?nèi)蝿?wù)執(zhí)行是否完成的方法,或者獲取任務(wù)結(jié)果的方法粪摘,等等瀑晒。僅當(dāng)任務(wù)執(zhí)行完成了阀湿,才能獲取到結(jié)果。
并且調(diào)用get()方法會(huì)阻塞當(dāng)前線程直到任務(wù)執(zhí)行完成瑰妄,如果任務(wù)已經(jīng)完成了,不能重新開始或者取消映砖,除非這個(gè)任務(wù)調(diào)用了runAndReset()方法间坐。(Executes the computation without setting its result, and then?resets this future to initial state, failing to do so if thecomputation encounters an exception or is cancelled.? This is designed for use with tasks that intrinsically execute more* than once.)
FutureTask可以包裝一個(gè)Callable或者是Runnable,因?yàn)镕utureTask實(shí)現(xiàn)了Runnable對(duì)象(Callable接口類似于Runnable,Callable相對(duì)于Runnable來說,僅僅多了一個(gè)返回值和Exception拋出而已)邑退,我們可以把一個(gè)FutureTask提交給線程池的Executor來執(zhí)行竹宋。FutureTask,除了作為一個(gè)單獨(dú)的類之外地技,它的protected 方法在我們自定義Task的時(shí)候是非常有用的蜈七。
FutureTask源碼分析
你是如何拿到一個(gè)線程的執(zhí)行結(jié)果的?Future體系源碼深度解析 - 簡(jiǎn)書
可以根據(jù)這個(gè)文章來看
在實(shí)現(xiàn)的 方法種有個(gè)run方法 其中有用到
UNSAFE.compareAndSwapObject(this, runnerOffset,null, Thread.currentThread()))
這個(gè)是一個(gè)CAS操作 是個(gè)樂觀鎖 對(duì)操作是原子的 保證是最新的
CAS底層使用JNI調(diào)用C代碼實(shí)現(xiàn)的莫矗,如果你有Hotspot源碼飒硅,那么在Unsafe.cpp里可以找到它的實(shí)現(xiàn)