3 回答

TA貢獻1821條經驗 獲得超6個贊
在功能上,這兩種方法或多或少是相同的:
您提交任務以供執行;
你不等結果。
但是,從技術上講,存在一些細微差別:
在第二種方法中,您沒有指定執行程序,因此它將使用通用的
ForkJoinPool
.supplyAsync()
如果您不想要,則必須將 executor 作為第二個參數傳遞;該
CompletableFuture
API允許容易地連鎖更多的呼叫用thenApply()
,thenCompose()
等,這是由此更靈活比簡單的Future
返回通過ExecutorService.submit()
;Using
CompletableFuture
允許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);

TA貢獻1921條經驗 獲得超9個贊
在這兩種情況下,您都不會等待結果。
第二種方法的優點是更少的樣板文件。這就是runAsync()
和supplyAsync()
是不錯的。
但是如果你實際上沒有返回任何值,你應該使用 runAsync()
第二種方法還提供了等待所有期貨的能力CompletableFuture.allOf()
。這在第一個場景中也不存在。

TA貢獻1824條經驗 獲得超6個贊
如果您使用的是 executorservice,請不要忘記在 executor 上調用 shutdown()。您也可以使用 runAsync() 而不是 supplyAsync()。
添加回答
舉報