ExecutorService.submit(任务)与 CompletableFuture.supplyAsync(任务,执行者)

ExecutorService.submit(Task) vs CompletableFuture.supplyAsync(Task, Executor)

为了运行一些并行或异步的东西,我可以使用 ExecutorService: <T> Future<T> submit(Runnable task, T result); 或 CompletableFuture Api:static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor); (假设我在两种情况下都使用相同的执行器)

除了 return 类型之外 FutureCompletableFuture 是否有任何显着差异。或者什么时候使用什么?

如果我使用 CompletableFuture API 和默认 Executor (没有执行程序的方法)有什么区别?

Besides the return type Future vs. CompletableFuture are there any remarkable differences. Or When to use what?

真的很简单。当您希望执行线程等待异步计算响应时,您可以使用 Future。这方面的一个例子是并行 merge/sort。异步左排序,同步右排序,等待左边完成(future.get()),合并结果。

当您想要执行某些操作时,您可以使用 CompleteableFuture,完成后的结果与执行的线程异步。例如:我想异步进行一些计算,当我计算时,将结果写入某个系统。请求线程可能不需要等待结果。

您可以在单个 Future 可执行文件中模仿上述示例,但 CompletableFuture 提供了更流畅的界面和更好的错误处理。

这真的取决于你想做什么。

And what are the differences if i use the CompletableFutureApi with default Executor (the method without executor)?

它将委托给 ForkJoin.commonPool(),这是您系统上 CPU 数量的默认大小。如果你正在做一些 IO 密集型的事情(读取和写入文件系统),你应该以不同的方式定义线程池。

如果 CPU 密集,使用 commonPool 最有意义。

CompletableFuture 具有丰富的功能,例如链接多个 future、组合 future、在 future 执行后执行某些操作(同步和异步)等

但是,CompletableFuture在性能上和Future没有区别。即使组合 CompletableFuture 的多个实例(最后使用 .thenCombine 和 .join),其中 none 个也会被执行,除非我们调用 .get 方法,并且在此期间,调用线程会被阻塞。我感觉在性能上,这并不比 Future 好。

如果我遗漏了某些方面的性能,请告诉我。

这为我阐明了未来和可完成的未来之间的区别:Difference between Future and Promise

CompletableFuture 更像是一个承诺。