Future和FutureTask應用詳解

1.Future模式

Future模式和多線程技術密切相關,可以說是利用多線程技術優化程序的一個實例。

在程序設計中,當某一段程序提交了一個請求,期望得到一個答覆。但非常不幸的是,服務程序對這個請求的處理可能比較慢,比如,這個請求可能是通過互聯網、HTTP或者Web Service等並不高效的方式調用的。在傳統的單線程環境下,調用函數是同步的,也就是說它必須等到服務程序返回結束後,才能進行其他處理。而在Future模式下,調用方式改為異步的,而原先等待返回的時間段,在主調用函數中,則可能用於處理其它事務。下面我們嘗試實現這一功能:

1)Main方法的實現

main方法主要負責調用Client發起請求,並使用返回的數據:

Future和FutureTask應用詳解

2)Client的實現

client主要實現了獲取FutureData,開啟構造RealData的線程,並在接受請求後,很快的返回FutureData。

Future和FutureTask應用詳解

3)Data的實現

Data是一個接口,提供了getResult()方法。

public interface Data {

String getResult();

}

4)FutureData的實現

FutureData 實現了一個快速返回的RealData 包裝。它只是一個包裝,或者說是一個RealData 的虛擬實現 。因此,它可以很快被構造並返回。當使用FutureData的getResult()方法時,程序會阻塞,等待RealData()被注入到程序中,才使用RealData的getResult()方法返回。

Future和FutureTask應用詳解

5)RealData 的實現

RealData 是最終需要使用的數據模型,它的構造很慢。在這裡,使用sleep()函數模擬這個過程。

Future和FutureTask應用詳解

程序運行的流程是Main線程去獲取數據,但是數據還在處理中,於是Main線程進入等待狀態,當數據處理完並通知等待所有等待的線程之後,Main線程得以繼續運行下去。

運行結果:

Future和FutureTask應用詳解

2.JDK的內置實現

Future模式如此常用,以至於在JDK的併發包中,就已經內置了一種Future模式的實現了。

示例程序:

Future和FutureTask應用詳解

Future和FutureTask應用詳解

Callable接口是一個用戶自定義實現的接口。在應用程序中,通過實現Callable接口的call()方法,指定FutureTask的實際內容和返回對象。

Future接口提供的線程控制功能有:

//取消任務
boolean cancel(boolean mayInterruptIfRunning)
//是否已經取消
boolean isCancelled()
//是否已經完成
boolean isDone()
//取得返回對象

V get() throws InterruptedException, ExecutionException
//取得返回對象,可以設置超時時間
V get(long timeout, TimeUnit unit)

Future模式的核心在於使用多線程技術去除了主函數中的等待時間,並使得原來需要等待的時間段可以用於處理其他的業務邏輯,從而充分利用計算機資源。


分享到:


相關文章: