CompletableFuture 与 ExecutorService

CompletableFuture vs ExecutorService

我已经尝试过可以由 CompletableFuture 完成的复杂用例,也可以由 ExecutorService 完成。这也包括处理异常。

我能看到它们之间的唯一区别是,CompletableFuture 在编码过程中提供了更好的可读性和便利性。

是否有任何可以使用 CompletableFuture 而不是 ExecutorService 解决的实际优势/用例?

CompletableFuture 的主要优点(至少对我而言)是它允许以更高的概率构建一个复杂的异步进程,以便从第一次就做对,并且在一段时间后仍然能够理解逻辑.

当然大部分可以使用ExecutorService来实现,这就需要subclass它,重写一些方法,重新提交任务...大部分都是CompletableFuture覆盖出来的盒子。此外,每次 jdk 更新时,最佳实践都会集成到 CompletableFuture class.

因此,使用 CompletableFuture 的实际原因是简单(嗯,您仍然需要了解如何使用它)。

例如:

CompletableFuture.supplyAsync(...)
    .completeOnTimeout("foo" , 1, TimeUnit.SECONDS);

用ExecutorService实现没那么简单

想象简单的情况,你做动作A复杂的时候,做B,结果是A - 是 Throwable 或有效结果。再加上还没有 CompletableFuture,你不想阻止。仅 Futures 可行吗?嗯,是。实现起来很痛苦吗?非常.

不要被其 API 的“简单性”所迷惑。在您之前的问题中,您已经了解了 not 为某些操作指定 ExecutorService 的作用。这种“简单”的包装带来了很多很多更微妙的东西。

CompletableFuture 的非阻塞功能使其高度可用并被开发人员高度采用。不仅是我们,普通开发人员,还有 jdk 开发人员 - 整个 jdk http 客户端都是围绕 CompletableFuture 构建的,这是有原因的。

你的问题不是 vs ExecutorService,而应该是 vs FutureExecutorService 仍然可以传递给 CompletableFuture 提供的方法。例如,阅读 了解各种方法的作用和行为。