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

CompletableFuture 源码解析

为什么会出现回调地狱

那是因为大家想把外层方法拿到的结果值,直接传递给回调函数。

但是如果把外城拿到的结果值用一个变量存储起来,例如 Future. future 在外层方法拿不到结果时, 直接阻塞住。 等拿到外层方法的结果, 在传递给 回调函数.

回调地狱

	ExecutorService executor = Executors.newFixedThreadPool(5);
ListeningExecutorService guavaExecutor = MoreExecutors.listeningDecorator(executor);
ListenableFuture<String> future1 = guavaExecutor.submit(() -> {//step 1System.out.println("执行step 1");return "step1 result";
});
ListenableFuture<String> future2 = guavaExecutor.submit(() -> {//step 2System.out.println("执行step 2");return "step2 result";
});
ListenableFuture<List<String>> future1And2 = Futures.allAsList(future1, future2);
Futures.addCallback(future1And2, new FutureCallback<List<String>>() {@Overridepublic void onSuccess(List<String> result) {System.out.println(result);ListenableFuture<String> future3 = guavaExecutor.submit(() -> {System.out.println("执行step 3");return "step3 result";});Futures.addCallback(future3, new FutureCallback<String>() {@Overridepublic void onSuccess(String result) {System.out.println(result);}        @Overridepublic void onFailure(Throwable t) {}}, guavaExecutor);}@Overridepublic void onFailure(Throwable t) {}}, guavaExecutor);

CompletableFuture

ExecutorService executor = Executors.newFixedThreadPool(5);
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {System.out.println("执行step 1");return "step1 result";
}, executor);
CompletableFuture<String> cf2 = CompletableFuture.supplyAsync(() -> {System.out.println("执行step 2");return "step2 result";
});
cf1.thenCombine(cf2, (result1, result2) -> {System.out.println(result1 + " , " + result2);System.out.println("执行step 3");return "step3 result";
}).thenAccept(result3 -> System.out.println(result3));

CompletableFuture 原理分析

简单理解CompletableFuture 就是一个被观察者,或者理解为是一个结果容器, 因为它持有result,
这个result记录的这个Completable 的上游传递下来的结果。

同时拿到上游传递下来的结果后, 他会触发自身的stack中存储的回调函数执行, 让回调函数执行后, 回调函数把结果传递给下游的CompletableFuture 实现数据流的流动。

仅仅需要把Completure理解存储结果的容器

执行链是 Completion. 即 CompletableFuture 设置值完成后,需要调用完成的函数。
在这里插入图片描述

CompletableFuture 的同步 &异步

http://www.dtcms.com/a/278746.html

相关文章:

  • vLLM与SGLang在自然语言处理领域的技术架构与性能对比研究
  • Linux中的系统日志(Rsyslog)
  • 【机器人编程基础】python文件的打开和关闭
  • 【Python3教程】Python3高级篇之MySQL - mysql-connector 驱动介绍及示例
  • [论文阅读] 人工智能 + 软件工程 | 用大语言模型+排名机制,让代码评论自动更新更靠谱
  • Mybatis(黑马)
  • H.264编解码(NAL)
  • 本地小市值miniqmt开发成功
  • 【无标题】Go迭代器完全指南:从基础到实战
  • 行为模式-观察者模式
  • grpo nl2sql qwen3 模型强化学习训练有效果的成立条件有哪些
  • java+vue+SpringBoo智慧草莓基地管理系统(程序+数据库+报告+部署教程+答辩指导)
  • 岳飞:精忠报国的千古英雄
  • 【基础架构】——架构设计流程第三步(评估和选择备选方案)
  • 什么是实时数仓?实时数仓又有哪些应用场景?
  • Kubernetes 高级调度01
  • 【Linux】基本指令详解(一) 树状文件结构、家目录、绝对/相对路径、linux文件类型
  • 【Linux】Jenkins Lts 配置构建 Maven 项目
  • 制作一款打飞机游戏80:道具碰撞
  • FastAPI-P1:Pydantic模型与参数额外信息
  • ThreadLocal结构
  • 02 51单片机之LED闪烁
  • 用TensorFlow进行逻辑回归(三)
  • 计算机网络通信的相关知识总结
  • Faiss库
  • 玩转Docker | 使用Docker部署TeamMapper思维导图应用程序
  • JavaScript 性能优化实战:深入性能瓶颈,精炼优化技巧与最佳实践
  • 深入理解MyBatis延迟加载:原理、配置与实战优化
  • 浏览器自动化领域的MCP
  • Ubuntu22.04 python环境管理