- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我刚刚开始探索 Java 8 的一些并发特性。让我有点困惑的一件事是这两个静态方法:
CompletableFuture<Void> runAsync(Runnable runnable)
CompletableFuture<U> supplyAsync(Supplier<U> supplier)
最佳答案
简答
不,使用 Callable
不是更自然而不是 Supplier
在 CompletableFuture.supplyAsync
.争论几乎完全是关于语义的,所以如果你事后仍然感到不相信也没关系。
长答案 Callable
和 Supplier
功能接口(interface)/SAM 类型在功能上实际上是等效的(请原谅双关语),但它们的起源和预期用途不同。
Callable
是作为 java.util.concurrent
的一部分创建的包裹。该包出现在 Java 8 中围绕 lambda 表达式的巨大变化之前,最初集中在一系列帮助您编写并发代码的工具上,而不会偏离手动多线程的经典模型。Callable
的主要用途是抽象一个可以在不同线程中执行并返回结果的 Action 。来自 Callable
的Javadoc:
The
Callable
interface is similar toRunnable
, 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
?
CompletableFuture
是
java.util.concurrent
新增内容的一部分受 Java 8 中上述变化的启发,并允许开发人员以函数式的、隐式可并行化的方式构建他的代码,而不是在其中显式处理并发。
supplyAsync
方法需要一种方法来提供特定类型的结果,并且它对这个结果更感兴趣,而不是为达到这个结果而采取的行动。它也不一定关心异常完成(另请参阅
下面的... 段落如何)。
Runnable
用于无参数、无结果的功能接口(interface),不应该Callable
用于无参数,单结果功能接口(interface)?
java.util.function
中没有包含对没有参数且不返回结果(因此完全通过外部上下文的副作用进行操作)的函数的抽象。 .这意味着(有点烦人)
Runnable
用于需要此类功能接口(interface)的任何地方。
Exception
可以被 Callable.call()
抛出的?
Callable
之间预期语义差异的一个小迹象和
Supplier
.
Callable
是一个可以在另一个线程中执行的操作,它允许您检查其执行后的副作用。如果一切顺利,您会得到一个特定类型的结果,但由于在执行某些操作时可能会出现异常情况(尤其是在多线程上下文中),您可能还需要定义和处理此类异常情况。
Supplier
另一方面是一个函数,您依赖它来提供某种类型的对象。作为
Supplier
的直接消费者,特殊情况不一定是您的责任。 .这是因为:
Exception
s 可以是一个单独的阶段,以防万一Exception
s 显着降低了函数接口(interface)、lambda 表达式和方法引用的表达能力 关于java - CompletableFuture supplyAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36256337/
Java 文档说 CompletableFuture:supplyAsync(Supplier supplier)在 ForkJoinPool#commonPool() 中运行任务而 Completa
我想创建一个 CompletableFuture,其返回值在 Kotlin 中的特定执行程序上运行。 下面的代码工作得很好。 return CompletableFuture.supplyAsync
我刚刚开始探索 Java 8 的一些并发特性。让我有点困惑的一件事是这两个静态方法: CompletableFuture runAsync(Runnable runnable) Completable
在生产环境中发现关于 CompletableFuture.supplyAsync() 的问题我们有如下的批处理方法: import java.util.ArrayList; import java.u
我是 CompletableFuture 的新手,我想调用一个可以引发异常的方法 MetadataLoginUtil::login。但是,尽管我已经“异常”地编写了下面的代码,但并未编译。它说我必须将
这个问题已经有答案了: Why is CompletableFuture.supplyAsync succeeding a random number of times? (1 个回答) 已关闭 5
我在 CompletableFuture.supplyAsync(() -> { } 中有 10 行代码 junit 测试用例跳过了那 10 行代码。我怎样才能涵盖这 10 个行 Comple
我正在开发一个与其他网络应用程序通信的网络应用程序。有时,我的系统会向其他系统发送 HTTP 请求作为通知。由于他们的响应对我来说不是必需的,我使用 Java 8 CompletableFuture
需要确认一些事情。代码如下: CompletableFuture .supplyAsync(() -> {return doSomethingAndReturnA();}) .then
我正在运行下面的一些异步任务,需要等待它们全部完成。我不确定为什么,但是 join() 不会强制等待所有任务,并且代码会继续执行而无需等待。连接流未按预期工作是否有原因? CompletableFut
我正在编写一个程序来从源下载历史报价。该源每天通过 http 提供需要解析和处理的文件。该程序使用不同阶段的 CompletableFuture 并行下载多个文件。第一阶段是使用 HttpClient
我正在运行下面的一些异步任务,需要等待它们全部完成。我不确定为什么,但是 join() 不会强制等待所有任务,并且代码会继续执行而无需等待。连接流未按预期工作是否有原因? CompletableFut
我对 Java 8 中的 lambda 表达式和异步代码都很陌生。我不断得到一些奇怪的结果... 我有以下代码: import java.util.concurrent.CompletableFutu
我有这段代码: CompletableFuture .supplyAsync(() -> { return smsService.sendSMS(number); }
我在 foreach 循环中定义了 completableFuture.supplyAsync(),所以每个条目(每个异步任务)都添加一个列表,我需要从 completableFuture.suppl
我不明白这里发生了什么 CompletableFuture/supplyAsync。 如果我从先前实例化的 CompletableFuture 对象调用 supplyAsync 方法,它永远不会完成:
CompletableFuture::supplyAsync(() -> IO 绑定(bind)查询) 我如何为 CompletableFuture::supplyAsync 选择执行器以避免污染 F
伙计们!我有一个问题:这段代码是做什么的: Collection contracts = fillTheCollectionFromDb(); contracts.stream().filter(co
我正在比较 的行为CompletableFuture.supplyAsync() 在我设置自定义 ExecutorService 或我希望我的供应商由默认执行程序(如果未指定)执行的两种情况下,即 F
我正在尝试使用mockito测试CompletableFuture.supplyAsync函数,但测试未完成可能是因为可完成的 future 没有返回。我不确定代码中缺少什么。任何人都可以帮忙吗? 我
我是一名优秀的程序员,十分优秀!