溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java中分階段任務(wù)執(zhí)行舉例分析

發(fā)布時間:2021-11-24 16:27:41 來源:億速云 閱讀:143 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“java中分階段任務(wù)執(zhí)行舉例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“java中分階段任務(wù)執(zhí)行舉例分析”吧!

CompletableFuture介紹

CompletableFuture類實現(xiàn)了CompletionStage與Future接口。CompletionStage翻譯過來就是完成階段,表示任務(wù)的每個階段,然后它聲明了一些接下來對任務(wù)處理方式,而CompletableFuture是它的實現(xiàn)者。

可以把CompletableFuture看成流水線上的單元,一個單元完成可以觸發(fā)下一個單元的執(zhí)行,完成后接著觸發(fā)下一個,直到所有單元完成,最終會產(chǎn)生一個最終結(jié)果。

CompletableFuture也實現(xiàn)了Future接口, 代表一個異步執(zhí)行的任務(wù),可以獲取異步完成后結(jié)果。所以CompletableFuture也可以當(dāng)做一個Future,n那么就能夠顯式地完成這個Future。 

所以CompletableFuture表示一個階段,也可以被當(dāng)做一個任務(wù),相當(dāng)于把流水線分成了各個任務(wù),所以是階段與任務(wù)的綜合體。 

主要方法介紹

CompletableFuture提供的方法很多,并且大多數(shù)CompletableFuture方法都會返回一個CompletableFuture,然后再繼續(xù)調(diào)用新的方法,所以后面把調(diào)用方法的階段對象叫做前一個階段,而這個方法則表示這個階段。

這里先把方法進(jìn)行分類,分類總結(jié)圖如下圖:

 java中分階段任務(wù)執(zhí)行舉例分析

首先是以Async結(jié)尾的方法,它表示要執(zhí)行的階段將會異步的執(zhí)行,這類方法都可以傳遞一個executor(線程池)進(jìn)去,指定線程池去異步執(zhí)行,如果沒有指定則會使用默認(rèn)的通過ForkJoinPool實現(xiàn)。

后續(xù)其他方法基本上都可以和Async(除了anyof與allof),如果方法有Async則表示是異步執(zhí)行,否則是同步執(zhí)行。 

然后我們來看以thenApply開頭的方法,thenApply可以分成兩個部分:

then表示這個階段的動作發(fā)生當(dāng)前的階段正常完成之后。

Apply表示這個階段會使用前一個階段(調(diào)用這個方法的階段對象)返回的結(jié)果作為參數(shù)。 

thenApply如果后面接了Async則表示下一個階段會采用異步執(zhí)行,如果沒有則會使用同一個線程繼續(xù)執(zhí)行,后面的方法也差不多。 

然后就是一個thenAccept開頭的方法了,它實際上和thenApply差不多,只不過它接受的參數(shù)是Consumer,也就是是一個存消費者,并不返回值。如果下一階段接收了當(dāng)前階段的結(jié)果,但是在計算的時候不需要返回值(它的返回類型是void)。 

applyToEither可以處理兩個階段,當(dāng)前階段與作為參數(shù)傳遞進(jìn)去的other階段,只要其中一個完成那么另外一個參數(shù)fn就會執(zhí)行。也就是它的功能是只要任何一個階段完成就可以進(jìn)入下一個階段了。

acceptEither與applyToEither的區(qū)別就和thenAccept和thenApply區(qū)別一樣。 

runAfterBoth方法就像上面那類方法相反,必須要兩個階段的任務(wù)完成后才能進(jìn)入下一個階段;

thenAcceptBoth方法接受的參數(shù)是CompletableFuture與BiConsumer,BiConsumer可以接受他們兩個的結(jié)果然后進(jìn)行計算; 

同樣thenCombine方法也能獲取到前面兩個階段的結(jié)果,這兩個階段相互獨立,然后把兩個結(jié)果進(jìn)行整合;

thenCompose表面上看起來也是一個階段的結(jié)果放到另外的階段上,但是它有不一定的不同,它是新建一個階段,這個階段會有多個后續(xù)階段,而最開始的結(jié)果可以作為新的階段的任意一個階段使用。就好像一個工作的單元的產(chǎn)品可以作為另外一個流水線的任意單元使用。 

anyOf方法接受一個CompletableFuture集合,只要集合中任意一個完成中使用whenComplete(BiConsumer<? super Object, ? super Throwable> action)就可以用來處理完成的結(jié)果;

allOf方法與anyOf方法差不多,只不過它是等所有的CompletableFuture完成后才處理whenComplete。

案例

方法都介紹完了,在做一個案例具體化,案例如下圖:

 java中分階段任務(wù)執(zhí)行舉例分析

這個案例比較簡單,并且把每一步都返回用變量來接受了。

到此,相信大家對“java中分階段任務(wù)執(zhí)行舉例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI