关于 CompletableFuture 类的疑惑

讨论 未结 11 59
7911364440
7911364440 会员 2022年8月4日 03:27 发表
<pre><code>CompletableFuture&lt;Integer&gt; future = CompletableFuture.supplyAsync(() -&gt; 1) .thenApplyAsync(i -&gt; i+1) .thenApplyAsync(i -&gt; i+1) .thenAccept(i -&gt; System.out.println(i)); </code></pre> <p><code>thenApplyAsync()</code>和<code>thenApply()</code>这两个方法都需要等待前一个任务的返回值,那么<code>thenApplyAsync()</code>异步的含义是什么?</p>
收藏(0)  分享
相关标签: 灌水交流
注意:本文归作者所有,未经作者允许,不得转载
11个回复
  • momocraft
    2022年8月4日 03:27
    thenApplyAsync 的参数函数会跑在不同的线程
    0 0
  • dqzcwxb
    2022年8月4日 03:57
    所有带 Async 的方法都意味着会使用新的线程池去执行任务,如果你不指定则使用默认的 ForkJoinPool 线程池指定则使用你指定的线程池 理论上也有可能会是同一个线程去执行,比如线程池就 1 个线程或者刚好调度到同一个线程
    0 0
  • Jooooooooo
    2022年8月4日 03:57
    你试着不用这个功能把 A, B, C 三个任务串起来写, 会非常恶心. 它这个是极大简化前后有关联的任务写法. 至于异步的含义, 有可能是 D 依赖 C1, C2 的完成才能执行, 而 C1, C2 是可以并行跑的, C1 依赖 B, C2 依赖 A. 如果不用它提供的这个工具, 你自己要写这么一串, 代码会很长
    0 0
  • 7911364440
    2022年8月4日 03:57
    我的疑惑就是 thenApplyAsync 虽然会使用新的线程去执行任务,但也还是要等待前一个任务的返回值,使用新的线程去执行任务的意义是什么呢?
    0 0
  • jiulang
    2022年8月4日 03:57
    未必是新的线程,是从池里取出一个当前空闲的线程来执行,执行完就放到池里
    0 0
  • yazinnnn
    2022年8月4日 04:56
    public CompletionStage<Void> thenAcceptAsync(Consumer<? super T> action); 如果直接使用这个 api 的话, 貌似跟 thenAccept 没啥区别 public CompletionStage<Void> thenAcceptAsync(Consumer<? super T> action, Executor executor) 如果用这个的话, 可以将后续任务切换到其他线程池中进行, 比如之前运行在 eventloop 线程, 接下来的任务是阻塞耗时操作, 那么可以切换到 worker 线程中进行
    0 0
  • msaionyc
    2022年8月4日 04:56
    不同场景使用不同的线程池是很有必要的,默认的线程池并不适用所有的场景
    0 0
  • wangyu17455
    2022年8月4日 05:28
    不阻塞 io 线程就是意义,springboot 默认只给 tomcat200 条 io 线程,如果你的业务代码是异步的,返回了 CompletableFuture 或者 spring 的 Flux/Mono ,那就可以交给 netty 去调度你的代码,线程数量就不再会限制你的连接数,可以完全跑满 cpu 的性能而不会浪费大量的时间在线程切换上
    0 0
  • shyling
    2022年8月4日 05:28
    一个是跑异步,一个是跑同步
    0 0