Java 8 CompletableFuture 与 Netty 未来

Posted

技术标签:

【中文标题】Java 8 CompletableFuture 与 Netty 未来【英文标题】:Java 8 CompletableFuture vs Netty Future 【发布时间】:2016-03-11 15:35:17 【问题描述】:

JDK 8中引入的CompletableFuture与Netty提供的io.netty.util.concurrent.Future相比如何?

Netty 文档提到

JDK 8 添加了有些重叠的 CompletableFuture io.netty.util.concurrent.Future http://netty.io/wiki/using-as-a-generic-library.html

我试图得到答案的问题是:

    它们的相同点和不同点是什么? 两者的性能特征有何不同?哪一个能够更好地扩展?

关于相同点/不同点,我已经能够提出以下几点:

相似之处: 基本的相似之处在于与 Java Future 相比,两者都是非阻塞的。这两个类都有可用于向未来添加侦听器、内省任务的失败和成功并从任务中获取结果的方法。

区别: CompletableFuture 似乎有一个更丰富的接口,用于编写多个异步活动等。另一方面,Netty 的 io.netty.util.concurrent.Future 允许将多个侦听器添加到同一个 Future,此外还允许删除侦听器。

【问题讨论】:

您可以多次调用CompletableFuture.thenDoSomething()方法,类似于在其他未来框架中添加多个监听器。 CompletableFuture 有类似 Netty Future 的事件循环吗? @user1870400 CompletableFuture(以及任何其他实现 CompletionStage 的类)具有像 thenApplythenApplyAsync 这样的方法,它们以不同的方式工作。像thenApply 这样的方法将立即在同一个线程上执行,而thenApplyAsync 将使用Executor 执行,这可以通过事件循环来实现(尽管默认是工作窃取池)。 这里有一些关于该主题的讨论:github.com/netty/netty/issues/2105 【参考方案1】:

如果我们看整个段落(尤其是第一句话)

Java 有时会通过采用包含结构的思想来取得进步 由 Netty 提供。例如,JDK 8 添加了 CompletableFuture 有些重叠 io.netty.util.concurrent.Future。在这种情况下, Netty 的构造为您提供了一个很好的迁移路径;我们将 考虑到未来的迁移,努力更新 API。

它的基本意思是,netty FutureCompletableFuture 是同一个概念,但在不同的时间由不同的人实现。 Netty 创造了他们的未来,因为在 java 中没有一个可用的,而且他们不想将一个作为 Guice 之类的依赖项引入。但是现在java已经创建了一个,并且可以使用了。 在段落的末尾,他们基本上是在说 netty API 将来可能会用 CompletableFuture 替换 Future。 就相似之处/不同之处而言,它们都只是future/promise 模式的众多实现之一。当你使用 netty api 和 netty 特定的东西时使用 netty one,否则使用CompletableFuture

【讨论】:

以上是关于Java 8 CompletableFuture 与 Netty 未来的主要内容,如果未能解决你的问题,请参考以下文章

Java 8 CompletableFuture 浅入

Java 8 CompletableFuture 与 Netty 未来

Java 8 的异步编程利器 CompletableFuture 详解

Java 8 的异步编程利器 CompletableFuture 详解

Java 8 的异步编程利器 CompletableFuture 详解

Java 8 的异步利器:CompletableFuture源码级解析(建议精读)