- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Java 线程新手,我正在尝试了解 completableFuture API 的工作原理。当我运行下面的代码时,我得到线程名称输出,如下所示。 SupplyAsync 和 ThenApplyAsync 似乎使用相同的线程,即 ForkJoinPool.commonPool-worker-1。我的理解是,如果我使用ThenApplyAsync,则ThenApplyAsync使用与SupplyAsync不同的线程。你能告诉我这是怎么回事吗?谢谢!
代码:
public static void main(String[] args) throws InterruptedException, ExecutionException {
System.out.println("Current Thread : " + Thread.currentThread().getName());
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
System.out.println("Current Thread (SupplyAsync) : " + Thread.currentThread().getName());
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException ex) {
throw new IllegalStateException(ex);
}
return "Result";
}).thenApplyAsync(result -> {
System.out.println("Current Thread (ThenApplyAsync) : " + Thread.currentThread().getName());
return result.toUpperCase();
});
System.out.println("CompletableFuture Result : " + future.get());
}
输出:
Current Thread : main
Current Thread (SupplyAsync) : ForkJoinPool.commonPool-worker-1
Current Thread (ThenApplyAsync) : ForkJoinPool.commonPool-worker-1
CompletableFuture Result : RESULT
最佳答案
您错误地认为 thenApplyAsync 将使用与前一个完成阶段不同的线程。
<U> CompletableFuture<U> thenApplyAsync(Function<? super T,? extends U> fn)
Returns a new CompletionStage that, when this stage completes normally, is executed using this stage's default asynchronous execution facility, with this stage's result as the argument to the supplied function.
它使用与前一阶段相同的执行设施,即 ForkJoinPool.commonPool()
。但除此之外,无法保证它在池中的哪个线程上运行。
关于java - TheApplyAsync 与 CompletableFuture 使用与 SupplyAsync 线程相同的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58423022/
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 没有返回。我不确定代码中缺少什么。任何人都可以帮忙吗? 我
我是一名优秀的程序员,十分优秀!