gpt4 book ai didi

java - CompletableFuture supplyAsync

转载 作者:IT老高 更新时间:2023-10-28 20:42:07 27 4
gpt4 key购买 nike

我刚刚开始探索 Java 8 的一些并发特性。让我有点困惑的一件事是这两个静态方法:

CompletableFuture<Void> runAsync(Runnable runnable) 
CompletableFuture<U> supplyAsync(Supplier<U> supplier)

有谁知道他们为什么选择使用接口(interface)供应商?使用Callable是不是更自然,类比Runnable返回值?那是因为供应商没有抛出无法处理的异常吗?

最佳答案

简答

不,使用 Callable 不是更自然而不是 SupplierCompletableFuture.supplyAsync .争论几乎完全是关于语义的,所以如果你事后仍然感到不相信也没关系。

长答案
CallableSupplier功能接口(interface)/SAM 类型在功能上实际上是等效的(请原谅双关语),但它们的起源和预期用途不同。

Callable 是作为 java.util.concurrent 的一部分创建的包裹。该包出现在 Java 8 中围绕 lambda 表达式的巨大变化之前,最初集中在一系列帮助您编写并发代码的工具上,而不会偏离手动多线程的经典模型。
Callable的主要用途是抽象一个可以在不同线程中执行并返回结果的 Action 。来自 Callable的Javadoc:

The Callable interface is similar to Runnable, in that both are designed for classes whose instances are potentially executed by another thread.



Supplier 是作为 java.util.function 的一部分创建的包裹。该包是 Java 8 中上述更改的一个组成部分。它提供了可以由 lambda 表达式和方法引用作为目标的通用函数类型。

一种这样的类型是没有参数的函数返回结果(即提供某种类型的函数或 Supplier 函数)。

那么为什么Supplier而不是 Callable ?
CompletableFuturejava.util.concurrent 新增内容的一部分受 Java 8 中上述变化的启发,并允许开发人员以函数式的、隐式可并行化的方式构建他的代码,而不是在其中显式处理并发。

它的 supplyAsync方法需要一种方法来提供特定类型的结果,并且它对这个结果更感兴趣,而不是为达到这个结果而采取的行动。它也不一定关心异常完成(另请参阅 下面的... 段落如何)。

尽管如此,如果 Runnable用于无参数、无结果的功能接口(interface),不应该Callable用于无参数,单结果功能接口(interface)?

不必要。
java.util.function 中没有包含对没有参数且不返回结果(因此完全通过外部上下文的副作用进行操作)的函数的抽象。 .这意味着(有点烦人) Runnable用于需要此类功能接口(interface)的任何地方。

查了的怎么办Exception可以被 Callable.call() 抛出的?

这是 Callable 之间预期语义差异的一个小迹象和 Supplier .

A Callable是一个可以在另一个线程中执行的操作,它允许您检查其执行后的副作用。如果一切顺利,您会得到一个特定类型的结果,但由于在执行某些操作时可能会出现异常情况(尤其是在多线程上下文中),您可能还需要定义和处理此类异常情况。

A Supplier另一方面是一个函数,您依赖它来提供某种类型的对象。作为 Supplier 的直接消费者,特殊情况不一定是您的责任。 .这是因为:
  • ...函数式接口(interface)通常用于定义多阶段过程中的特定阶段,以创建或改变数据,以及处理 Exception s 可以是一个单独的阶段,以防万一
  • ...显式处理 Exception s 显着降低了函数接口(interface)、lambda 表达式和方法引用的表达能力
  • 关于java - CompletableFuture supplyAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36256337/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com