Future模式是多線程中常見的設(shè)計模式,其核心思想是異步調(diào)用。當(dāng)需要調(diào)用一個函數(shù)時,如果這個函數(shù)執(zhí)行很慢就需要進行等待,或者我們可能并不急于要結(jié)果,此時可以讓被調(diào)這立即返回,讓它在后臺慢慢處理。對于調(diào)用者來說則可以去處理其他任務(wù),在真正需要數(shù)據(jù)的時再去嘗試獲取所需的數(shù)據(jù)。
對于Future模式,它無法立即給你所需的數(shù)據(jù),但它會返回給你一個契約,之后你可以用這個契約重新獲取所需的數(shù)據(jù)。
1、Future模式的主要角色
Future模式的主要參與者及作用:
Main:系統(tǒng)啟動,調(diào)用Client發(fā)出請求
Client:返回Data對象,立即返回FutureData,并開啟ClientThread線程裝配RealData
Data:返回數(shù)據(jù)的接口
FutureData:Future數(shù)據(jù),構(gòu)造快,是一個虛擬數(shù)據(jù),需要裝配RealData
RealData:真實數(shù)據(jù),構(gòu)造比較慢
2、Future模式的簡單實現(xiàn)
在實現(xiàn)中定義一個核心接口Data,它是客戶端希望獲取的數(shù)據(jù)。在Future模式中,這個Data接口有2個重要的實現(xiàn):RealData(真實數(shù)據(jù),即最終需要獲取的有價值的信息)和FutureData(它是用來提取RealData的一個“訂單”,可以立即返回得到)。
FutureData實現(xiàn)了一個快速范圍的RealData包裝,它是一個RealData的虛擬實現(xiàn),可以很快被構(gòu)造并返回。當(dāng)使用FutureData.getResult()時如果實際數(shù)據(jù)還沒準備好,程序就會阻塞,等待FutureData準備好并注入到FutureData中,才最終返回數(shù)據(jù)。
RealData是最終需要返回的數(shù)據(jù)模型,它的構(gòu)造可能比較慢。
Client實現(xiàn)了獲取FutureData,并開啟構(gòu)造RealData的線程。在接受請求后,很快返回FutureData。它不會等待數(shù)據(jù)真正構(gòu)造完成再返回,而是立刻返回FutureData,即使FutureData中并沒有真實數(shù)據(jù)。
3、Java中的Future模式
JDK中提供了一套完整的Future模式實現(xiàn)。Future接口類似于契約,可以得到真實的數(shù)據(jù)。RunnableFuture繼承了Future和Runnable接口,其中run()方法用于構(gòu)造真實的數(shù)據(jù)。它有一個具體的實現(xiàn)類FutureTask,F(xiàn)utureTask有一個內(nèi)部類Sync,一些實質(zhì)性的工作會委托Sync實現(xiàn)。Sync最終會調(diào)用Callable接口,完成實際數(shù)據(jù)的組裝工作。
Callable接口只有一個方法call(),它會返回需要構(gòu)造的實際數(shù)據(jù)。如果我們想要實現(xiàn)自己的業(yè)務(wù)系統(tǒng),通常需要實現(xiàn)自己的Callable對象。
Future接口中的方法定義:
cancel(boolean mayInterruptIfRunning):取消任務(wù)
isCancelled():是否已經(jīng)取消
isDone():是否已經(jīng)完成
get():取得返回對象
get(long timeout, TimeUnit unit):取得返回對象,可以設(shè)置超時時間
--參考文獻《實戰(zhàn)Java高并發(fā)程序設(shè)計》