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

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

ExecutorService 與 CompletableFuture

ExecutorService 與 CompletableFuture

米琪卡哇伊 2021-09-15 16:40:01
我一直在嘗試實現一個異步過程,其中父方法調用一個子方法,該子方法將依次調用三個不同的方法。我希望所有這些過程都異步完成,即在子方法中的這三個調用并行進行后,控件應該返回到父方法并繼續執行其余部分。我有這段代碼,經過測試可以正常工作。public ReturnSomething parent(){    child();    ...//rest to UI}private void child(){  ExecutorService executorService = Executors.newFixedThreadPool(3);  Runnable service1 = () -> {     MyFileService.service1();  };  Runnable service2 = () -> {      MyFileService.service2();  };  Runnable service3 = () -> {      MyFileService.service3();  };  executorService.submit(service1);  executorService.submit(service2);  executorService.submit(service3);}現在,我的領導要求我使用它。public ReturnSomething parent(){    child();    ...//rest to UI}private void child(){    CompletableFuture.supplyAsync(() ->  MyFileService.service1();    CompletableFuture.supplyAsync(() ->  MyFileService.service2();    CompletableFuture.supplyAsync(() ->  MyFileService.service3();}我知道 CompletableFuture 是 Java 8 的新內容,但是第二個代碼如何比第一個更好?因為對于 ExecutorService,我沒有調用“get()”方法,所以我不會等待 aysnc 響應。那么,有人可以解釋一下有什么區別嗎?
查看完整描述

3 回答

?
達令說

TA貢獻1821條經驗 獲得超6個贊

在功能上,這兩種方法或多或少是相同的:

  • 您提交任務以供執行;

  • 你不等結果。

但是,從技術上講,存在一些細微差別:

  • 在第二種方法中,您沒有指定執行程序,因此它將使用通用的ForkJoinPoolsupplyAsync()如果您不想要,則必須將 executor 作為第二個參數傳遞;

  • CompletableFutureAPI允許容易地連鎖更多的呼叫用thenApply()thenCompose()等,這是由此更靈活比簡單的Future返回通過ExecutorService.submit();

  • UsingCompletableFuture允許child()使用return CompletableFuture.allOf(the previously created futures).

關于可讀性,這是一個偏好問題,但如果您想要等效的代碼,CompletableFuture一旦您對其進行了類似的格式化,該方法可能會被認為可讀性稍差。相比:

executorService.submit(MyFileService::service1);

executorService.submit(MyFileService::service2);

executorService.submit(MyFileService::service3);


CompletableFuture.supplyAsync(MyFileService::service1, executorService);

CompletableFuture.supplyAsync(MyFileService::service2, executorService);

CompletableFuture.supplyAsync(MyFileService::service3, executorService);


查看完整回答
反對 回復 2021-09-15
?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

在這兩種情況下,您都不會等待結果。

第二種方法的優點是更少的樣板文件。這就是runAsync()supplyAsync()是不錯的。

但是如果你實際上沒有返回任何值,你應該使用 runAsync()

第二種方法還提供了等待所有期貨的能力CompletableFuture.allOf()。這在第一個場景中也不存在。


查看完整回答
反對 回復 2021-09-15
?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

如果您使用的是 executorservice,請不要忘記在 executor 上調用 shutdown()。您也可以使用 runAsync() 而不是 supplyAsync()。


查看完整回答
反對 回復 2021-09-15
  • 3 回答
  • 0 關注
  • 291 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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