深入理解Future體系

FutureTask類實現(xiàn)了RunnableFuture接口,

而RunnableFuture繼承了Runnable和Future,

也就是說FutureTask既是Runnable,也是Future。

因此FuntureTask可以直接作為Thread的構造參數(shù)直接使用了。

Callable接口

@FunctionalInterfacepublicinterfaceCallable{Vcall()throwsException;}

Callable接口類似于Runnable,都是為了成為其它線程的執(zhí)行單元而被設計出來的,但與Runnable不同的是,Callable接口不僅擁有返回值,還會拋出異常。

Future接口

Future表示的是異步計算的結果,在Future接口中,提供了一些用于檢查任務執(zhí)行是否完成,等待任務執(zhí)行完成和取出任務執(zhí)行結果的方法。

當運算完成后只能通過get()方法進行檢索,并且調用了get()方法后出阻塞當前線程直到任務執(zhí)行完成。

通過cancel()方法,可以取消任務。

通過isCancelled()方法,可以判斷任務是否被取消了

通過isDone()方法,可以判斷任務是否已經(jīng)完成了

RunnableFuture接口

RunnableFuture 繼承自Runnable和Future,即提供了可以使用Runnable來執(zhí)行任務,又可以使用Future執(zhí)行獲取結果的功能,同時還擁有了取消任務,判斷任務狀態(tài)的功能

FutureTask

一個異步可取消計算,F(xiàn)utureTask提供了Future接口的基本實現(xiàn),其中包含開始執(zhí)行任務和結束任務的方法,查詢任務執(zhí)行是否完成的方法,或者獲取任務結果的方法,等等。僅當任務執(zhí)行完成了,才能獲取到結果。

并且調用get()方法會阻塞當前線程直到任務執(zhí)行完成,如果任務已經(jīng)完成了,不能重新開始或者取消,除非這個任務調用了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可以包裝一個Callable或者是Runnable,因為FutureTask實現(xiàn)了Runnable對象(Callable接口類似于Runnable,Callable相對于Runnable來說,僅僅多了一個返回值和Exception拋出而已),我們可以把一個FutureTask提交給線程池的Executor來執(zhí)行。FutureTask,除了作為一個單獨的類之外,它的protected 方法在我們自定義Task的時候是非常有用的。

FutureTask源碼分析

你是如何拿到一個線程的執(zhí)行結果的?Future體系源碼深度解析 - 簡書

可以根據(jù)這個文章來看

在實現(xiàn)的 方法種有個run方法 其中有用到

UNSAFE.compareAndSwapObject(this, runnerOffset,null, Thread.currentThread()))

這個是一個CAS操作 是個樂觀鎖 對操作是原子的 保證是最新的

CAS底層使用JNI調用C代碼實現(xiàn)的,如果你有Hotspot源碼,那么在Unsafe.cpp里可以找到它的實現(xiàn)

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容