news 2026/10/24 7:23:17

异步CompletableFuture最常用的用法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
异步CompletableFuture最常用的用法

下面用「核心场景 + 极简代码 + 一句话说明」的形式,把CompletableFuture最常用的用法拆得更清晰,只保留核心逻辑,去掉冗余:

一、最基础:创建异步任务(核心中的核心)

场景 1:无返回值(比如广告统计、日志记录)
// 推荐:自定义线程池(避免默认池耗尽) Executor pool = Executors.newFixedThreadPool(3); CompletableFuture.runAsync(() -> { // 要异步执行的代码(比如统计广告数据) System.out.println("异步执行无返回值任务"); }, pool); // 极简版(临时测试用) CompletableFuture.runAsync(() -> System.out.println("异步执行无返回值任务"));

一句话:runAsync+ 任务代码 + (可选)自定义线程池,执行完就结束,不用返回结果。

场景 2:有返回值(比如异步查数据库、调接口)
Executor pool = Executors.newFixedThreadPool(3); CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { // 异步执行并返回结果(比如查数据库返回字符串) return "异步任务的返回结果"; }, pool); // 极简版 CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "返回结果");

一句话:supplyAsync+ 有返回值的代码,能拿到异步任务的结果。

二、拿到结果后:怎么处理(链式操作)

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "hello"); // 1. 转换结果(比如把hello变成hello world) future.thenApply(str -> str + " world"); // 有返回值 // 2. 消费结果(比如打印、存日志,不用返回) future.thenAccept(str -> System.out.println("拿到结果:" + str)); // 无返回值 // 3. 任务完事后执行(不管结果,比如弹个提示) future.thenRun(() -> System.out.println("任务执行完了")); // 无返回值

一句话:

  • thenApply:改结果、有返回;
  • thenAccept:用结果、无返回;
  • thenRun:只执行、不关心结果。

三、多任务配合:多个异步任务怎么协同

CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> "任务1结果"); CompletableFuture<Integer> task2 = CompletableFuture.supplyAsync(() -> 2); // 1. 串联执行(任务1的结果传给任务2) task1.thenCompose(res1 -> CompletableFuture.supplyAsync(() -> res1 + "-任务2")); // 2. 合并结果(任务1和任务2都做完,合并结果) task1.thenCombine(task2, (res1, res2) -> res1 + res2); // 结果:任务1结果2 // 3. 等所有任务做完(比如批量处理10个异步任务) CompletableFuture.allOf(task1, task2).join(); // 阻塞等task1、task2都完成 // 4. 只要有一个任务做完(比如多接口抢结果) CompletableFuture.anyOf(task1, task2); // 谁先做完就用谁的结果

一句话:

  • thenCompose:任务串着来;
  • thenCombine:任务并行做、合并结果;
  • allOf:等所有任务;
  • anyOf:等第一个完成的任务。

四、必加:异常处理(避免异步异常丢了)

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { throw new RuntimeException("任务出错了"); // 模拟异常 }); // 1. 异常兜底(出错了返回默认值) future.exceptionally(e -> { System.err.println("捕获异常:" + e.getMessage()); return "出错后的默认值"; // 异常时返回这个值 }); // 2. 完成回调(不管成功/失败都执行) future.whenComplete((res, e) -> { if (e != null) { System.err.println("任务失败:" + e.getMessage()); } else { System.out.println("任务成功:" + res); } });

一句话:

  • exceptionally:出错了给个兜底值;
  • whenComplete:成功 / 失败都能处理。

五、最后:怎么拿结果(尽量少阻塞)

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "返回结果"); // 1. 阻塞拿(简单,推荐用这个) String res1 = future.join(); // 出错抛运行时异常,不用try-catch // 2. 超时拿(防止卡死,更安全) String res2 = future.get(1, TimeUnit.SECONDS); // 1秒拿不到就抛超时异常,需try-catch // 3. 非阻塞拿(拿不到就给默认值) String res3 = future.getNow("默认值"); // 任务没做完就返回"默认值"

一句话:

  • join():简单阻塞拿结果;
  • get(超时):防止无限等;
  • getNow():不阻塞,拿不到就兜底。

最终核心总结(记这几句就够)

  1. 无返回值异步:runAsync(任务, 线程池);
  2. 有返回值异步:supplyAsync(任务, 线程池);
  3. 处理结果:转结果用thenApply、用结果用thenAccept;
  4. 多任务:串着做thenCompose、合并结果thenCombine、等全部allOf;
  5. 异常:必加exceptionally/whenComplete;
  6. 拿结果:优先join()(简单)或get(超时)(安全)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/24 9:07:37

企业微信开发总卡壳?试试cpolar,回调调试超顺畅

前言 企业微信开发中&#xff0c;回调功能用于接收服务器的通知和数据&#xff0c;比如审批结果、打卡信息等&#xff0c;是实现消息推送、OAuth2 授权等功能的关键。它适用于企业 IT 人员、开发者&#xff0c;能帮助企业搭建内部业务系统与企业微信的连接&#xff0c;优点是能…

作者头像 李华
网站建设 2026/10/24 21:36:25

ChatPPT:国内综合实力最强的AI PPT工具

&#x1f451; 第一名&#xff1a;ChatPPT&#xff08;www.chatppt.cn&#xff09; 综合多项评测&#xff0c;ChatPPT在2025年被认为是国内综合实力最强的AI PPT工具之一&#xff0c;其优势主要体现在以下几个方面。 海量模板与强大设计&#xff1a;ChatPPT拥有超过40万套模板…

作者头像 李华
网站建设 2026/10/25 3:59:00

测试经验,自动化测试的痛点+发展趋势,一篇带你上高速...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 早期&#xff0c;…

作者头像 李华
网站建设 2026/10/25 0:21:38

NetGuard实战指南:告别流量焦虑,让Android网络管理如此简单

你是否曾经发现手机流量莫名其妙地消失&#xff1f;是否担心某些应用在后台偷偷上传你的隐私数据&#xff1f;现在&#xff0c;一款名为NetGuard的Android应用能帮你彻底解决这些问题。作为一款无需root权限的网络管理工具&#xff0c;NetGuard通过本地虚拟专用网络技术为你提供…

作者头像 李华
网站建设 2026/10/24 5:38:45

大厂已经不用人干活了?“AI中台+Agent”正在重塑商业规则

当一部分企业还在讨论AI能做什么时&#xff0c;领先的大厂已经悄悄完成了一场组织变革&#xff1a;HR、法务、营销、财务等部门的工位上&#xff0c;迎来了一批724小时不眠不休、效率惊人的“新同事”——AI Agent。这并非取代&#xff0c;而是进化。“AI中台 AI Agent” 的王…

作者头像 李华
网站建设 2026/10/24 5:20:17

Qwen2.5-Omni全模态大模型:70亿参数重构人机交互范式

导语 【免费下载链接】Qwen2.5-Omni-3B 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen2.5-Omni-3B 阿里巴巴通义千问团队发布的Qwen2.5-Omni-3B全模态大模型&#xff0c;以70亿参数实现文本、图像、音频、视频的端到端处理&#xff0c;开创轻量化通用人工智能…

作者头像 李华