Doug Lea大师携手CompletableFuture喜迎国庆(上)

简介: PS:最近是跳槽的高峰期,我连日加班好多天,整理出了包含16000 多道面试题的面试宝典,并且指北君也会持续更新这份面试宝典中的题目,希望它能帮助大家找到自己心仪的工作!【文末有领取方式】

completeFuture作为Doug Lea大师的有一个艺术作品,把并发编程的艺术发挥到极致。之前的Future为我们提供了多线程执行返回值的使用问题。而CompletableFuture则为我们提供了一种线程执行结果连续处理的能力。为多线程编程提供了更为简洁的方式。关于CompletableFuture,我会分为多篇来讲,今天会为大家介绍一下其基本方法以及不同名称参数的方法含义及作用。


1 Completable Future是什么

70.png

CompletableFuture 实现了Future,那么也就会有Future的全部功能(其实就是5个方法)。

CompletionStage 是JDK1.8 Doug Lea 设计的一个接口,旨在提高多任务协同执行的编码效率。是一个可异步完成的Stage,可以根据当前Stage的完成情况连续调用,且支持异步计算的各种方法。并有发生异常时的处理方法。

一个Stage的action的执行,可以是在单个stage完成之后,两个stage都完成之后,或者两个stage中有一个正常完成之后。

CompletableFuture实现了CompletionStage接口,那么其stage的这种设计方式也得到了实现。


2 Completable Future 构造及简单使用

2.1 创建CompleteableFuture的方法

  • 可以直接new一个CompleteableFuture。
  • 可以调用supplyAsync静态方法去异步执行,返回一个带有result的CompleteableFuture。
  • 静态方法runAsync异步执行后返回一个没有result的CompleteableFuture
  • 也可以使用静态方法completedFuture,直接返回一个完成状态的CompleteableFuture。

示例


71.png

CompleteableFuture 其主要方法大多为CompletionStage相关的方法。

  • thenCompose 平行处理两个
  • thenCombine 聚合两个stage的result
  • thenAccept 直接消费
  • thenRun 直接执行
  • theApply

我们先列出来,后面会一一讲到。

2.2 从CompleteableFuture中获取执行结果

相关方法有

  • join() 没有抛出检查的异常,会阻塞等待执行结果。
  • get() 会抛出检查异常,会阻塞等待执行结果
  • getNow(T valueIfAbsent) 不会阻塞


3 Completable Future 各方法介绍

CompleteableFuture实现了CompletionStage,其相关方法比较多。我们分组来介绍。

3.1 主要参数为Supplier的方法

Supplier的Lamada表达式没有输入值,但是有返回值。

72.png

supplyAsync 会异步执行Supplier方法,然后返回一个带有Result的CompletableFuture。

73.pngcompleteAsync(Supplier<? extends T> supplier)

使用默认的线程池来异步执行Supplier方法,将其结果作为此CompletableFuture的result,来完成此CompletableFuture. 另一个方法为使用自定义线程池。


3.2 主要参数为Runnable的方法

Runnable标记了函数式接口,其唯一的方法无参数,且无返回值。所以相关方法中返回的的CompletableFuture也不包含返回值。相关Runable的方法如下。

3.2.1 静态方法。


74.png

runAsync(Runnable runnable) 是一个静态方法,在给定的任务完成后,将使用ForkJoinPool.commonPool() 线程池来异步执行相关任务,并返回CompletableFuture,但是CompletableFuture中没有执行的结果。Runable为参数的方法中返回的CompletableFuture对象都不包含其执行结果。

**runAsync(Runnable runnable,Executor executor)**也是静态方法,不同的是使用了自定义的线程池。

3.2.2 thenRun系列

75.png

thenRun(Runnable action) 是CompletableFuture对象的一个方法,表示在调用方即CompletionStage(CompletableFuture实现了CompletionStage,所以也就可以表示任务完成的状态)正常完成的情况下会执行这个动作。

thenRunAsync(Runnable action) 表示在当前调用方正常完成任务时异步执行此动作,默认使用ForkJoinPool.commonPool()线程池来执行任务。

同理 thenRunAsync(Runnable action,Executor executor) 可以使用自定义线程池来异步执行


小结:

  • 方法中带有Async,则表示当前调用方正常完成任务时异步执行当前动作,默认使用ForkJoinPool.commonPool()线程池执行。
  • 方法中带有Async,参数中有Executor,则表明可以使用自定义线程池。

后面的讲解就只说明不带Async的方法了。


3.2.3 runAfterBoth

76.pngrunAfterBoth(CompletionStage<?> other,Runnable action)

表示当前调用方以及参数中给定的Stage都正常完成任务时才执行当前动作


3.2.4 runAfterEither


77.png


runAfterEither(CompletionStage<?> other,Runnable action)

这个不用我说你都能才出来了吧。表示当前调用方以及参数中给定的Stage任何一个Stage正常完成任务就执行当前动作。


3.3 主要参数为Function的方法

78.png

Functioin接口定义T为输入值R为输出值。便是此Lamada表达式包含了输入输出值。


3.3.1 thenApply

79.png

thenApply(Function<? super T,? extends U> fn)

当前Stage正常完成后,再执行此Function任务,并且会将当前的Stage结果作为Function中的参数。最后返回一个CompletionStage。

其余方法同上面讲的一样,均是默认线程池异步执行,或使用自定义线程池异步执行。

相关文章
|
监控 数据可视化 中间件
平台化三部曲之三流程编排 - 平台化是舞台,流程编排就是导演一场戏
在上两篇ATA中,第一篇讨论了平台的扩展性(《从Eclipse平台看交易平台化》),强调微内核和扩展机制实现,第二篇讨论平台的模块化开发(《Google Guice平台模块化开发的果汁》),强调业务隔离,松耦合。这这第三篇ATA中,想分享下平台化中另一个重要方面,平台的服务流程编排 (*备注:本文.
18965 2
|
分布式计算 算法 调度
课3-详解隐私计算框架的架构和技术要点
隐语架构涵盖产品、算法、计算、资源和硬件五层,旨在实现互联互通和跨域管控。产品层包括SecretPad等,简化用户和集成商体验。算法层涉及PSI/PIR、SCQL和联邦学习,提供隐私保护的数据分析和学习。计算层如RayFed、SPU、HEU等,支持分布式计算和密态处理。资源层的KUSCIA用于跨机构任务编排,硬件层涉及FPGA等加速器。互联互通支持黑盒和白盒模式,确保不同平台协作。跨域管控则强调数据流转控制,保护数据权益。
|
编解码 算法 安全
【总结整理】【路径规划】- 浅谈路径规划算法
# 0 序 本文将从两个大块浅谈一下路径规划算法,第一部分是规划算法本身,第二部分是地图。 ---- howe # 1 前言   移动一个简单的物体(object)看起来很容易,而路径搜索却比较复杂。那为什么涉及到路径搜索就产生麻烦了呢?考虑以下情况: ![image.png](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/
21642 4
【总结整理】【路径规划】- 浅谈路径规划算法
|
4月前
|
人工智能 移动开发 JavaScript
重磅!这款AI低代码平台火了:拖拽生成应用,一键输出Web/H5/UniApp
VTJ.PRO是AI驱动的低代码开发平台,支持可视化拖拽设计与自然语言对话生成代码,可一键输出Web、H5、UniApp三端标准Vue项目,实现“一次设计、多端交付”,大幅降低开发门槛并提升效能。(239字)
502 0
|
6月前
|
数据采集 人工智能 物联网
什么是微调?大模型定制化的核心技术与实操指南
微调让大模型从“通用助手”变为“专属专家”。通过少量数据训练,LoRA等轻量化方法可在单卡上实现高效优化,广泛应用于医疗、金融、电商等领域。数据驱动、成本低廉、效果显著,微调正推动AI定制化落地,人人皆可拥有专属AI。
|
前端开发 NoSQL Redis
如何实现大文件上传:秒传、断点续传、分片上传
如何实现大文件上传:秒传、断点续传、分片上传
1489 0
|
测试技术 持续交付 开发工具
《对于大规模的代码项目,如何进行有效的代码管理》
有效管理大规模代码项目至关重要。使用Git等版本控制系统追踪变化;合理组织代码结构;制定统一代码风格;编写详细文档与注释;实施持续集成和自动化测试;执行代码审查;持续优化代码;支持并行开发;强化团队协作;定期备份代码。这些措施能显著提升代码质量和可维护性。
415 11
|
存储 NoSQL 算法
【高阶数据结构】跳表 -- 详解
【高阶数据结构】跳表 -- 详解
|
人工智能 数据库 Python
LangChain之各类提示模板的使用
语言模型的提示是用户提供的一组指令或输入,用于指导模型的响应,帮助模型理解上下文并生成相关且连贯的基于语言的输出,例如回答问题、完成句子或参与某项活动、对话。
1043 2
|
网络协议 视频直播 网络架构
广播和组播之间的区别
【4月更文挑战第12天】
2531 1
广播和组播之间的区别