亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Guava Futures.transform with "Real" Executor vs.

Guava Futures.transform with "Real" Executor vs.

牛魔王的故事 2021-12-10 15:04:17
假設我有兩個重量級的 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。相反,transformAsyncwill(通過調用cancel(true)ListenableFuture返回的ListeningExecutorService)。transform 應該傳播中斷,但要做到這一點有一些微妙之處,見上面的鏈接。


查看完整回答
反對 回復 2021-12-10
  • 1 回答
  • 0 關注
  • 215 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號