- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不明白这里发生了什么 CompletableFuture/supplyAsync。
如果我从先前实例化的 CompletableFuture 对象调用 supplyAsync
方法,它永远不会完成:
public static void ex1() throws ExecutionException, InterruptedException {
final CompletableFuture<String> cf = new CompletableFuture<>();
cf.supplyAsync(() -> {
System.out.println("Main.m3");
return "Main";
});
System.out.println("Start: cf = " + cf);
final String value = cf.get();
System.out.println("End: value = " + value);
}
这是输出:
Start: cf = java.util.concurrent.CompletableFuture@5b480cf9[Not completed]
Main.m3
如您所见,System.out.println("End: cf = "+ cf);
永远不会执行。
为了让它运行,我需要在 supplyAsync 的主体中放置一个 complete(my value)
。
但是如果我在创建 CompletableFuture 时直接调用 supplyAsync
(或通过调用静态 CompletableFuture.supplyAsync
):
public static void ex2() throws ExecutionException, InterruptedException {
final CompletableFuture<String> cf = new CompletableFuture<>()
.supplyAsync(() -> {
System.out.println("Main.m3");
return "Main";
});
System.out.println("Start: cf = " + cf);
final String value = cf.get();
System.out.println("End: value = " + value);
}
它按预期工作。你可以在这里看到输出:
Start: cf = java.util.concurrent.CompletableFuture@5b480cf9[Not completed]
Main.m3
End: value = Main
所以我的问题是:这是为什么?有什么我想念的吗?
最佳答案
supplyAsync
是 static
返回新 CompletableFuture
的方法并且不应通过实例调用它。
在第一种情况中,您正在调用 get()
在 CompletableFuture
上从未开始任何事情。
事实上,您会注意到您的程序在调用 ex1()
时将保留在 pending
中永远的状态。正因为如此,它永远无法执行下一行,打印出结果 Main
。 (并行计算的另一个 Future
)。
重点是您不存储第二个 CompletableFuture
任何地方。所以你不可能调用正确的 get()
.
在您的第二种情况中,您正在构建返回值为 supplyAsync
的实例,然后将其存储在 cf
中.这是构建 CompletableFuture
的正确方法. (new CompletableFuture<>()
部分是多余的;事实上,您可以立即使用 supplyAsync
为它分配一个新实例)。
当您调用 get()
时因此,您等待合适的CompletableFuture
返回其结果。
关于java - CompletableFuture.supplyAsync 与新的 CompletableFuture(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48906538/
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 没有返回。我不确定代码中缺少什么。任何人都可以帮忙吗? 我
我是一名优秀的程序员,十分优秀!