假設我有兩個重量級的 IO 阻塞操作,findMatchInSomeDB() 和 getDetailsFromOtherDB(String objectKey)。此外,我希望它們在后臺運行,并使用 Guava Futures 將它們鏈接在一起,因為一個取決于另一個的結果(我知道這可以在一個簡單的 Callable 中按順序完成,但為了說明目的保持簡單):下面的consumeChain和consumeChainAsync方法之間是否有任何實際或細微差別?import com.google.common.base.Function;import com.google.common.util.concurrent.AsyncFunction;import com.google.common.util.concurrent.Futures;import com.google.common.util.concurrent.ListenableFuture;import com.google.common.util.concurrent.ListeningExecutorService;import com.google.common.util.concurrent.MoreExecutors;public class Consumer{ private final Retriever retriever; private final ListeningExecutorService executorSvc; public Consumer(Retriever retriever, ListeningExecutorService executorSvc) { this.retriever = retriever; this.executorSvc = executorSvc; } private void consumeChain(String searchCriteria) throws Exception { ListenableFuture<String> futureMatch = executorSvc.submit( () -> retriever.findMatchInSomeDB(searchCriteria)); Function<String, DataObject> keyToDataObj = objectKey -> retriever.getDetailsFromOtherDB(objectKey); // using "real" executor service so transform function runs // in the background ListenableFuture<DataObject> futureDataObj = Futures.transform( futureMatch, keyToDataObj, executorSvc); // ...do some other stuff in this thread... // do something with futureDataObj result futureDataObj.get(); }據我所知,兩者都將通過 運行每個重量級操作executorSvc,并且都會傳播取消和/或執行失敗。似乎transformAsync(而不是僅transform與 DirectExecutor 以外的執行程序一起使用)的唯一要點是當您使用返回 ListenableFuture 而不是直接運行操作的 API 時。我錯過了什么嗎?
1 回答

蝴蝶刀刀
TA貢獻1801條經驗 獲得超8個贊
似乎
transformAsync
(而不是僅transform
與 DirectExecutor 以外的執行程序一起使用)的唯一要點是當您使用返回 ListenableFuture 而不是直接運行操作的 API 時。
我認為就是這個想法。
但是,我可以想到一個transformAsync
稍微好一點的小差異:如果您調用cancel(true)
output Future
,transform
當前不會中斷運行的線程getDetailsFromOtherDB
。相反,transformAsync
will(通過調用cancel(true)
從ListenableFuture
返回的ListeningExecutorService
)。transform
應該傳播中斷,但要做到這一點有一些微妙之處,見上面的鏈接。
添加回答
舉報
0/150
提交
取消