当前位置: 首页 > article >正文

孤舟笔记 并发篇三十 CompletableFuture到底是个啥?为什么说它是异步编程的王者

文章目录一、先说结论CompletableFuture vs Future二、从 Future 的痛点说起三、链式回调异步流水线四、任务组合112五、异常处理别让流水线崩盘CompletableFuture 全景回答技巧与点评标准回答加分回答面试官点评个人网站你写过异步代码吗那种先发请求等结果回来再处理的逻辑用 Future 写起来简直是噩梦——get() 阻塞住了、多个任务组合全靠手写、异常处理全靠 try-catch 包裹。面试官一问CompletableFuture 了解吗你就知道它是个升级版但具体好在哪、怎么用说不上来。今天咱们把 CompletableFuture 的设计思路、核心用法和常见坑彻底讲清楚。一、先说结论CompletableFuture vs Future维度FutureCompletableFuture异步回调❌ 只能阻塞 get()✅ thenApply/thenAccept 等链式回调任务组合❌ 不支持✅ thenCombine/allOf/anyOf异常处理❌ 只能 try-catch✅ exceptionally/handle手动完成❌ 不支持✅ complete(T value)非阻塞❌ get() 阻塞✅ 回调驱动不阻塞一句话记住Future 是点外卖一直等CompletableFuture 是点外卖留电话到了打给你。二、从 Future 的痛点说起Future 是 Java 5 引入的异步模型但用起来很憋屈FutureStringfutureexecutor.submit(()-{returnqueryFromDB();// 耗时操作});Stringresultfuture.get();// 阻塞干等着三个致命问题get() 阻塞——异步变成了伪异步主线程还是卡住了无法组合——查完数据库再调远程接口你得自己写嵌套回调无法手动完成——超时了想给个默认值做不到CompletableFuture 就是来解决这些痛点的Java 8 引入灵感来自 JavaScript 的 Promise。三、链式回调异步流水线CompletableFuture 最核心的能力是链式回调——一个任务完成自动触发下一个CompletableFuture.supplyAsync(()-queryUser(userId))// 1. 异步查用户.thenApply(user-queryOrder(user.id))// 2. 拿到用户后查订单 .thenAccept(order-sendEmail(order))// 3. 拿到订单后发邮件.exceptionally(ex-{// 4. 异常兜底log.error(出错了,ex);returnnull;});生活类比就像工厂流水线——第一个工人加工完自动传给下一个工人不需要每个工人都站在旁边等。关键方法方法作用参数类型thenApply转换结果有返回值FunctionthenAccept消费结果无返回值ConsumerthenRun不关心结果执行下一步RunnablethenCompose扁平化类似 flatMapFunctionT, CompletableFuturethenApply和thenCompose的区别就像map和flatMap——后者用于下一步也是异步任务的场景。四、任务组合112两个异步任务都完成后怎么处理CompletableFuture 提供了丰富的组合方式// 场景同时查用户信息和订单信息都拿到后合并CompletableFutureUseruserFuturesupplyAsync(()-getUser());CompletableFutureOrderorderFuturesupplyAsync(()-getOrder());// 两个都完成合并结果userFuture.thenCombine(orderFuture,(user,order)-{returnnewUserOrderVO(user,order);// 两个结果都能用});// 等所有任务完成CompletableFuture.allOf(future1,future2,future3).join();// 任一完成即可CompletableFuture.anyOf(future1,future2,future3).join();生活类比allOf像请客——所有人都到了才开饭anyOf像叫车——任何一辆车到了就走。五、异常处理别让流水线崩盘异步任务抛异常链式调用不会自动中断但你需要主动处理CompletableFuture.supplyAsync(()-riskyOperation()).thenApply(result-process(result)).exceptionally(ex-{// 捕获异常返回默认值log.error(失败了,ex);returndefaultValue;});// 或者用 handle 同时处理正常和异常.supplyAsync(()-riskyOperation()).handle((result,ex)-{if(ex!null)returndefaultValue;// 异常走这里returnprocess(result);// 正常走这里 });注意坑thenApply里抛的异常exceptionally能抓住但如果thenApply之后的thenAccept抛异常前面的exceptionally抓不到——异常处理要放在链的末端。CompletableFuture 全景CompletableFuture 全景 核心能力 ├── 链式回调 ── thenApply/thenAccept/thenCompose ├── 任务组合 ── thenCombine/allOf/anyOf ├── 异常处理 ── exceptionally/handle └── 手动完成 ── complete/completeExceptionally 创建方式 ├── supplyAsync ── 有返回值的异步任务 ├── runAsync ── 无返回值的异步任务 └── 已知值 ── completedFuture(value) 线程池 ├── 不指定 ── ForkJoinPool.commonPool()⚠️ 共享池 └── 指定 ── supplyAsync(supplier, executor) 口诀CompletableFuture 链式调异步回调不阻塞 组合 allOf 和 anyOf异常 handle 要兜底 线程池别用共享池生产环境要指定。回答技巧与点评标准回答CompletableFuture 是 Java 8 引入的异步编程工具实现了 Future 和 CompletionStage 接口。相比 Future它支持链式回调thenApply/thenAccept、任务组合thenCombine/allOf/anyOf、异常处理exceptionally/handle和手动完成complete。核心思想是回调驱动——任务完成后自动触发下一步不需要阻塞等待真正实现了非阻塞异步编程。加分回答CompletionStage 设计模式CompletableFuture 实现了 CompletionStage 接口这是流水线模式——每个方法返回新的 CompletableFuture形成链式调用。和 Stream API 的设计理念一脉相承都是函数式编程的思想线程池陷阱不指定线程池时使用 ForkJoinPool.commonPool()这是全局共享池所有 CompletableFuture 和并行流共用。生产环境必须指定独立线程池否则一个慢任务可能拖垮整个应用超时控制Java 9 增加了 orTimeout() 和 completeOnTimeout()补齐了超时处理能力。Java 8 中需要用 CompletableFuture.anyOf 配合 schedule 来模拟超时面试官点评这道题考的是你对异步编程模型的理解深度。能说出链式回调任务组合异常处理是基本要求能讲清楚 thenApply 和 thenCompose 的区别、线程池为什么要指定才算及格。如果你能提到 CompletionStage 接口的设计、commonPool 的生产风险、Java 9 的超时增强面试官会认为你不仅用过还在生产中踩过坑这是非常加分的。原文阅读内容有帮助点赞、收藏、关注三连评论区等你

相关文章:

孤舟笔记 并发篇三十 CompletableFuture到底是个啥?为什么说它是异步编程的王者

文章目录一、先说结论:CompletableFuture vs Future二、从 Future 的痛点说起三、链式回调:异步流水线四、任务组合:11>2五、异常处理:别让流水线崩盘CompletableFuture 全景回答技巧与点评标准回答加分回答面试官点评个人网站…...

PaddleOCR-VL-1.5:端到端文档解析与文本识别技术解析

1. 项目背景与技术定位PaddleOCR-VL-1.5是百度飞桨团队推出的新一代文档解析与文本识别解决方案。作为工业级OCR技术的集大成者,这个版本在传统文字识别能力基础上,重点强化了复杂版式文档的结构化解析能力。我在处理金融票据和医疗档案数字化项目时&…...

轻量化视频理解:自回归预训练框架实践

1. 项目概述:当视频理解遇上轻量化预训练在视频分析领域,传统方法往往需要消耗大量计算资源来处理时序信息。我们团队最近实现的这个轻量级框架,核心思路是通过自回归方式对视频历史信息进行高效嵌入,仅用单块消费级显卡就能完成预…...

Rolling Forcing算法在实时视频处理中的应用与优化

1. 项目背景与核心价值在实时视频处理领域,传统帧生成技术往往面临计算延迟与画面流畅度难以兼顾的困境。Rolling Forcing算法最初源于流体动力学仿真领域,其核心思想是通过动态权重分配实现计算资源的精准调度。2022年NVIDIA研究院首次将该算法引入视频…...

AI集成终端mediar-ai/terminator:下一代命令行智能辅助工具

1. 项目概述:一个面向未来的终端模拟器如果你和我一样,每天有超过一半的工作时间是在终端(Terminal)里度过的,那么你对终端模拟器的挑剔程度,可能不亚于程序员对键盘的选择。从早年经典的xterm、gnome-term…...

Nacrith:基于预训练语言模型的高效无损数据压缩方案

1. 项目背景与核心价值在数据爆炸式增长的时代,存储和传输成本已成为企业的重要负担。传统压缩算法如ZIP、GZIP等虽然成熟,但面对文本类数据的压缩率已接近理论极限。Nacrith项目的出现,正是为了解决这一痛点——它创新性地将预训练语言模型&…...

爬虫进阶必修课:从正则表达式到re.sub实战,手把手教你打造智能文本清洗引擎

目录 第一章:一个脏数据引发的血案 1.1 典型的“脏”长啥样 1.2 re.sub的初印象 第二章:re.sub的四种进阶用法(附真实案例) 2.1 基础版:批量干掉控制字符 2.2 进阶版:用回调函数实现动态替换 2.3 高阶版:使用分组引用反向构建 2.4 性能优化版:编译正则 + 批量替…...

从课后题到实战:手把手教你用Docker和Kubernetes搭建自己的第一个私有云环境

从课后题到实战:手把手教你用Docker和Kubernetes搭建自己的第一个私有云环境 当你在ICT课程中第一次听到"云计算"这个词时,脑海中浮现的可能是那些漂浮在天空中的服务器集群,或者是某个遥远数据中心里闪烁的机器。但云计算的核心概…...

TDD + DDD 双剑合璧:我是如何用测试驱动出清晰领域模型的

TDD DDD 双剑合璧:我是如何用测试驱动出清晰领域模型的 当业务需求像一团迷雾般模糊不清时,我们往往陷入两难:要么过早陷入技术实现细节,导致模型偏离业务本质;要么在抽象讨论中原地打转,迟迟无法产出可验…...

5.3小记1

现在已经爬取了猫途鹰上九寨沟风景区和澳门所有评论数量大于两百的景点的评论了,筛选条件是总评论数量大于两百,爬取数据是中文简体内容,所以数量实际并不多。而且九寨沟景区的景点并不仅仅有九寨沟风景区,这只是一个总的&#xf…...

[特殊字符]️ 从零到一:手把手教你用 re.findall() 打造智能爬虫(2026最新实战)

目录 一、前言:为什么 2026 年我还要写一篇关于 re.findall() 的爬虫文章? 二、 re.findall() 到底是什么? 2.1 一句话解释 2.2 re.findall() 三大返回值陷阱(90% 的新手都踩过) 陷阱一:有分组时,返回元组列表 陷阱二:嵌套分组,只捕获最内层 陷阱三:(?...) 非…...

DLSS Swapper终极指南:3步完成游戏性能优化,告别手动替换烦恼

DLSS Swapper终极指南:3步完成游戏性能优化,告别手动替换烦恼 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾在《赛博朋克2077》中为了提升几帧而翻遍游戏目录?是否在《控制…...

【RT-DETR涨点改进】TGRS 2026 |独家创新首发、下采样涨点改进篇| 引入MWHL最大池化-小波下采样,同时融合最大池化与小波变换的优势,助力红外小目标检测,遥感目标检测有效涨点

一、本文介绍 🔥本文给大家介绍使用 MWHL最大池化-小波下采样 改进RT-DETR网络模型,在下采样阶段同时融合最大池化与小波变换的优势,在保留强响应语义信息的同时有效维持特征的结构细节,从而缓解传统下采样过程中小目标特征易丢失的问题。该模块通过频域与空间域信息的协…...

多核处理器内存分区技术解析与工程实践

1. 多核处理器系统分区的核心挑战与设计哲学在嵌入式系统领域,我们正面临一个有趣的矛盾:一方面,现代设备的功能复杂度呈指数级增长,导致单个子系统规模不断扩大;另一方面,这些子系统又需要更紧密的集成协作…...

通过Python快速编写第一个调用Taotoken多模型聊天补全的程序

通过Python快速编写第一个调用Taotoken多模型聊天补全的程序 1. 准备工作 在开始编写Python程序调用Taotoken多模型聊天补全之前,需要确保已经完成以下准备工作。首先需要注册Taotoken账号并获取API Key。登录Taotoken控制台后,可以在API Key管理页面创…...

【RT-DETR涨点改进】TGRS 2026 |独家创新首发、特征融合改进篇| 引入HEWL小波特征融合模块,通道-空间-频域交互联合高频增强,助力红外小目标检测,多模态目标检测有效涨点

一、本文介绍 🔥本文给大家介绍使用 HEWL小波特征融合模块 改进RT-DETR网络模型,作用在于在特征融合与上采样阶段引入频域高频信息指导特征重建,使模型在检测过程中不仅关注语义信息,还能够有效保留目标的边缘与细节结构,从而提升对小目标和弱目标的表达能力。通过小波分…...

Cursor规则集:用AI代码助手实现团队编码规范自动化

1. 项目概述:当你的代码编辑器开始“思考”如果你是一名开发者,最近可能频繁听到一个词:Cursor。它不再仅仅是一个光标,而是一款正在悄然改变许多程序员工作流的AI代码编辑器。而今天要聊的,不是Cursor本身&#xff0c…...

基于强化学习的层次化知识检索系统设计与优化

1. 项目背景与核心挑战 大型语言模型(LLM)在知识检索任务中常面临层次化数据结构处理的困境。传统检索方式依赖静态索引和固定匹配模式,难以适应知识图谱、文档树等嵌套层级场景。我在实际项目中发现,当用户查询涉及"计算机科…...

XIAO双通道Wi-Fi电能表:家庭能源监控利器

1. 项目概述:XIAO双通道Wi-Fi交流电能表最近在折腾家庭能源监控系统时,发现Seeed Studio新推出的XIAO双通道Wi-Fi交流电能表是个很有意思的设备。这款基于ESP32-C6模组的电能表配备了两个100A电流互感器(CT钳),可以直接接入Home Assistant实现…...

稀疏计算优化LLM预训练:原理、技术与硬件加速

1. 稀疏计算在LLM预训练中的核心价值大型语言模型(LLM)预训练的计算瓶颈主要来自矩阵乘法运算。在Transformer架构中,前馈网络(FFN)模块占据了大部分计算量——随着模型规模增大,FFN的计算占比可高达总预训练浮点运算的50%以上。传统密集矩阵乘法需要处理…...

Agent 一接骨架屏页面就开始误判完成态:从 Readiness Signal 到 DOM Stabilization 的工程实战

浏览器 Agent 一进企业后台,最容易踩的坑往往不是页面太慢,而是页面看起来已经“加载好了”,实际仍停留在骨架屏、占位卡片和半成品 DOM。⚠️ 人类会等列表真实出现再点,Agent 如果只看到按钮可见、节点已挂载,就可能…...

A11y Bridge:为AI Agent实现毫秒级Android自动化交互

1. 项目概述:为AI Agent赋予“实时视觉”与“触手”在移动应用自动化测试和AI智能体交互领域,我们常常面临一个核心瓶颈:如何让运行在电脑上的程序“看见”并“操作”手机屏幕?传统的方法,无论是基于adb shell screenc…...

Flutter 跨平台实战:OpenHarmony 健康管理应用 Day3|页面路由跳转与多表单联动实现

🎯 Flutter 跨平台实战:OpenHarmony 健康管理应用 Day3|页面路由跳转与多表单联动实现 欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 🚀 前言 大家好!本篇是我真实完成 Flutte…...

Agent 一接富文本编辑器就开始改错块:从 Selection Grounding 到 Undo Fence 的工程实战

很多团队以为 Agent 接上富文本编辑器后,剩下只是“把字打进去”。真到生产环境,事故常出在另一层:模型知道要改哪一句,人却只看到整篇文档被误覆盖。最常见的现象不是不会写,而是改错块、删错段、撤销失控。这类问题一…...

Agent 一接浏览器本地存储就开始串租户:从 Storage Namespace 到 Session Snapshot 的工程实战

很多浏览器 Agent 在演示环境里很稳,一进多租户后台就开始出现“登的是 B 账号,提交的却是 A 组织草稿”的事故。⚠️ 问题不在 DOM 识别,而在浏览器本地状态没跟任务边界一起清空。Cookie 已刷新,页面却仍会从旧的 localStorage、…...

2026年企业网站建设趋势:为什么说“移动优先”不再是可选项而是必选项?

2026年企业网站建设趋势:为什么说“移动优先”不再是可选项而是必选项?如果你今天还在问“我的网站需要适配手机吗”,你可能已经错过了两年的窗口期。2026年,超过65%的网站流量来自移动设备。谷歌早已全面采用移动优先索引——这意…...

如何在Windows上快速安装安卓应用:APK Installer完整免费指南

如何在Windows上快速安装安卓应用:APK Installer完整免费指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上轻松运行安卓应用&#xff…...

5个理由告诉你为什么LyricsX是macOS上最智能的歌词伴侣

5个理由告诉你为什么LyricsX是macOS上最智能的歌词伴侣 【免费下载链接】LyricsX 🎶 Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX 还在为找不到合适的歌词软件而烦恼吗?LyricsX作为一款专为macOS设计的…...

git worktree

文章目录1.简介2.格式3.常用选项4.示例4.1 为现有分支创建 worktree4.2 创建新分支并同时创建 worktree4.3 查看所有 worktree4.4 移除不再需要的 worktree4.5 锁定 worktree(防止在 prune 时被清除)4.6 清理已删除的 worktree 引用5.小结参考文献1.简介…...

做端侧 AI 应用,绝不等于强行跑大模型

【端侧 AI 实践】如何在 20MB 包体积限制下,实现小程序的"实时"AR 视觉与 VLM 场景理解? 在构建基于 AI 的摄影辅助小程序时,我们面临了一个非常经典且棘手的端侧 AI 架构矛盾。 理想情况下,我们希望通过视觉大模型&…...