Google Guava –期货
這篇文章是我在Google Guava上的系列文章的延續(xù),這次涵蓋了Future。 Futures類是用于使用Future / ListenableFuture接口的靜態(tài)實用程序方法的集合。 Future是提交給ExecutorService的異步任務(wù)(可運(yùn)行或可調(diào)用)的句柄。 Future界面提供以下方法:獲取任務(wù)的結(jié)果,檢查任務(wù)是否完成或取消任務(wù)。 ListenableFuture接口擴(kuò)展了Future接口,并添加了將完成偵聽器設(shè)置為在任務(wù)完成后運(yùn)行的功能。 要創(chuàng)建ListenableFuture,您首先需要裝飾一個ExecutorService實例,如下所示:
現(xiàn)在所有提交的Callables / Runnables將返回一個ListenableFuture。 MoreExecutors可以在com.google.common.util.concurrent包中找到。 ListenableFutures在覆蓋以前的帖子 。 期貨中有太多方法無法有效地涵蓋在一篇文章中,所以我只涉及:鏈,轉(zhuǎn)換,allAsList和successAsList。 在這篇文章中,我將交替使用Futures和ListenableFutures。
鏈
鏈方法返回一個ListenableFuture,其值是通過從輸入Future中獲取結(jié)果并將其作為參數(shù)應(yīng)用到Function對象來計算的, Function對象又返回另一個ListenableFuture。 讓我們看一個代碼示例并逐步執(zhí)行:
ListenableFuture<List<String>> indexSearch = luceneSearcher.searchAsync('firstName:martin');Function<List<String>, ListenableFuture<List<Person>>> queryFunction = new Function<List<String>, ListenableFuture<List<Person>>>() {@Overridepublic ListenableFuture<List<Person>> apply(final List<String> ids) {return dataService.getPersonsByIdAsync(ids);}};ListenableFuture<List<Person>> results = Futures.chain(indexSearch, queryFunction,executorService);為了更加清楚,這是searchAsync和getPersonsByIdAsync方法的作用。 在前面的代碼示例中,這些方法調(diào)用分別來自第2行和第8行:
public ListenableFuture<List<String>> searchAsync(final String query) {return executorService.submit(new Callable<List<String>>() {@Overridepublic List<String> call() throws Exception {return search(query);}});}public ListenableFuture<List<Person>> getPersonsByIdAsync(final List<String> ids) {return executorService.submit(new Callable<List<Person>>() {@Overridepublic List<Person> call() throws Exception {return getPersonsById(ids);}});}chain方法具有兩個簽名:
在確定使用哪種方法時,有幾點(diǎn)要考慮。
如果通過調(diào)用時間鏈完成了輸入將來,則所提供的函數(shù)將在調(diào)用線程中立即執(zhí)行。 此外,如果未提供執(zhí)行程序,則使用MoreExecutors.sameThreadExecutor。 MoreExecutors.sameThreadExecutor(顧名思義)位于ThreadPoolExecutor.CallerRunsPolicy之后,這意味著提交的任務(wù)在與執(zhí)行/提交相同的線程中運(yùn)行。
轉(zhuǎn)變
轉(zhuǎn)換方法類似于鏈?zhǔn)椒椒?#xff0c;因為它以Future和Function對象作為參數(shù)。 不同之處在于,不返回ListenableFuture,僅返回將給定功能應(yīng)用于輸入future的結(jié)果。 考慮以下:
List<String> ids = .... ListenableFuture<List<Map<String, String>>> dbRecords = dataService.getPersonDataByIdAsync(ids);Function<List<Map<String, String>>,List<Person>> transformDbResults = new Function<List<String>, List<Person>>() {@Overridepublic List<Person> apply(List<Map<String, String>> personMapList) {List<Person> personObjList = new ArrayList<Person>();for(Map<String,String> personDataMap : personMapList){personObjList.add(new Person(personDataMap);} return personObjList;}};ListenableFuture<List<Person>> transformedResults = Futures.transform(dbRecords, transformDbResults, executorService);transform方法具有與chain相同的重載方法調(diào)用,但有相同的警告。
AllAsList
allAsList方法將采用任意數(shù)量的ListenableFutures作為變量或以Iterator <ListenableFuture>的形式。 返回一個ListenableFuture,其值是所有輸入結(jié)果的列表。 列表中返回的值與原始列表的順序相同。 如果任何輸入值被取消或失敗,則返回的ListenableFuture也將被取消或失敗。 從allAsList調(diào)用取消返回的future不會傳播到列表中提交的任何原始任務(wù)。
ListenableFuture<List<Person>> lf1 = getPersonsByFirstNameFuture('martin'); ListenableFuture<List<Person>> lf2 = getPersonsByFirstNameFuture('bob'); ListenableFuture<List<List<Person>>> lfResults = Futures.allAsList(lf1, lf2); //assume lf1 failed List<List<Person>> personLists = lfResults.get() //call results in exception
成功名單
successAsList方法與allAsList非常相似,但是更加寬容。 就像allAsList一樣,successAsList返回結(jié)果列表的順序與輸入列表的順序相同,但是如果任何輸入失敗或被取消,則列表中的相應(yīng)值將為null。 取消返回的將來也不會取消任何原始輸入。
ListenableFuture<List<Person>> lf1 = getPersonsByFirstNameFuture('martin'); ListenableFuture<List<Person>> lf2 = getPersonsByFirstNameFuture('bob'); ListenableFuture<List<List<Person>>> lfResults = Futures.successfulAsList(lf1, lf2); //assume lf1 failed List<List<Person>> personLists = lfResults.get(); List<Person> listOne = personLists.get(0) //listOne is null List<Person> listTwo = personLists.get(1) //listTwo, not null
結(jié)論
希望這有助于發(fā)現(xiàn)Google Guava的Futures類中包含的有用性。 我創(chuàng)建了一個單元測試,以顯示本文中描述的方法的示例用法。 由于有大量支持代碼,因此我在gihub上創(chuàng)建了一個項目guava-blog 。 該項目還將包含我以前在Guava上發(fā)表的文章( Monitor , ListenableFuture )的源代碼。 一如既往地歡迎提出意見和建議。
資源資源
- 番石榴項目首頁
- 期貨API
- 博客系列的源代碼
參考資料: Google Guava – JCG合作伙伴 Bill Bejeck的期貨,來自Random Thoughts On Coding博客。
翻譯自: https://www.javacodegeeks.com/2012/11/google-guava-futures.html
總結(jié)
以上是生活随笔為你收集整理的Google Guava –期货的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国最大的摩天轮在哪里?
- 下一篇: 让我们紧缩大数据