CompletableFuture应用源码分析

CompletableFuture应用&源码分析

2.1 CompletableFuture介绍

平时多线程开发一般就是使用Runnable,Callable,Thread,FutureTask,ThreadPoolExecutor这些内容和并发编程息息相关。相对来对来说成本都不高,多多使用是可以熟悉这些内容。这些内容组合在一起去解决一些并发编程的问题时,很多时候没有办法很方便的去完成异步编程的操作。

Thread + Runnable:执行异步任务,但是没有返回结果

Thread + Callable + FutureTask:完整一个可以有返回结果的异步任务

  • 获取返回结果,如果基于get方法获取,线程需要挂起在WaitNode里
  • 获取返回结果,也可以基于isDone判断任务的状态,但是这里需要不断轮询

上述的方式都是有一定的局限性的。

比如说任务A,任务B,还有任务C。其中任务B还有任务C执行的前提是任务A先完成,再执行任务B和任务C。

如果任务的执行方式逻辑比较复杂,可能需要业务线程导出阻塞等待,或者是大量的任务线程去编一些任务执行的业务逻辑。对开发成本来说比较高。

CompletableFuture就是帮你处理这些任务之间的逻辑关系,编排好任务的执行方式后,任务会按照规划好的方式一步一步执行,不需要让业务线程去频繁的等待

2.2 CompletableFuture应用

CompletableFuture应用还是需要一内内的成本的。

首先对CompletableFuture提供的函数式编程中三个函数有一个掌握

Supplier<U>  // 生产者,没有入参,有返回结果
Consumer<T>  // 消费者,有入参,但是没有返回结果
Function<T,U>// 函数,有入参,又有返回结果
2.2.1 supplyAsync

CompletableFuture如果不提供线程池的话,默认使用的ForkJoinPool,而ForkJoinPool内部是守护线程,如果main线程结束了,守护线程会跟着一起结束。

public static void main(String[] args)  {// 生产者,可以指定返回结果CompletableFuture<String> firstTask = CompletableFuture.supplyAsync(() -> {System.out.println("异步任务开始执行");System.out.println("异步任务执行结束");return "返回结果";});String result1 = firstTask.join();String result2 = null;try {result2 = firstTask.get();} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}System.out.println(result1 + "," + result2);
}
2.2.2 runAsync

当前方式既不会接收参数,也不会返回任何结果,非常基础的任务编排方式

public static void main(String[] args) throws IOException {CompletableFuture.runAsync(() -> {System.out.println("任务go");System.out.println("任务done");});System.in.read();
}
2.2.3 thenApply,thenApplyAsync

有任务A,还有任务B。

任务B需要在任务A执行完毕后再执行。

而且任务B需要任务A的返回结果。

任务B自身也有返回结果。

thenApply可以拼接异步任务,前置任务处理完之后,将返回结果交给后置任务,然后后置任务再执行

thenApply提供了带有Async的方法,可以指定每个任务使用的具体线程池。

public static void main(String[] args) throws IOException {ExecutorService executor = Executors.newFixedThreadPool(10);/*CompletableFuture<String> taskA = CompletableFuture.supplyAsync(() -> {String id = UUID.randomUUID().toString();System.out.println("执行任务A:" + id);return id;});CompletableFuture<String> taskB = taskA.thenApply(result -> {System.out.println("任务B获取到任务A结果:" + result);result = result.replace("-", "");return result;});System.out.println("main线程拿到结果:" + taskB.join());*/CompletableFuture<String> taskB = CompletableFuture.supplyAsync(() -> {String id = UUID.randomUUID().toString();System.out.println("执行任务A:" + id + "," + Thread.currentThread().getName());return id;}).thenApplyAsync(result -> {System.out.println("任务B获取到任务A结果:" + result + "," + Thread.currentThread().getName());result = result.replace("-", "");return result;},executor);System.out.println("main线程拿到结果:" + taskB.join());
}
2.2.4 thenAccept,thenAcceptAsync

套路和thenApply一样,都是任务A和任务B的拼接

前置任务需要有返回结果,后置任务会接收前置任务的结果,返回后置任务没有返回值

public static void main(String[] args) throws IOException {CompletableFuture.supplyAsync(() -> {System.out.println("任务A");return "abcdefg";}).thenAccept(result -> {System.out.println("任务b,拿到结果处理:" + result);});System.in.read();
}
2.2.5 thenRun,thenRunAsync

套路和thenApply,thenAccept一样,都是任务A和任务B的拼接

前置任务没有返回结果,后置任务不接收前置任务结果,后置任务也会有返回结果

public static void main(String[] args) throws 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/638058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式之迪米特法则:让你的代码更简洁、更易于维护

在软件开发中&#xff0c;设计模式是解决常见问题的最佳实践。其中&#xff0c;迪米特法则是一种非常重要的设计原则&#xff0c;它强调了降低对象之间的耦合度&#xff0c;提高代码的可维护性和可重用性。本文将介绍迪米特法则的概念、重要性以及在实际项目中的应用。 一、迪…

【微服务】springcloud集成sleuth与zipkin实现链路追踪

目录 一、前言 二、分布式链路调用问题 三、链路追踪中的几个概念 3.1 什么是链路追踪 3.2 常用的链路追踪技术 3.3 链路追踪的几个术语 3.3.1 span ​编辑 3.3.2 trace 3.3.3 Annotation 四、sluth与zipkin概述 4.1 sluth介绍 4.1.1 sluth是什么 4.1.2 sluth核心…

使用Ultimate-SD-Upscale进行图片高清放大

之前我们介绍过StableSR进行图片高清放大&#xff0c;如果调的参数过大&#xff0c;就会出现内存不足的情况&#xff0c;今天我们介绍另外一个进行图片高清放大的神器Ultimate-SD-Upscale&#xff0c;他可以使用较小的内存对图像进行高清放大。下面我们来看看如何使用进行操作。…

总线协议:GPIO模拟SMI(MDIO)协议:SMI协议介绍

0 工具准备 TN1305 Technical note IEEE802.3-2018 STM32F4xx中文参考手册 1 SMI介绍 1.1 SMI总体框图 站管理接口SMI&#xff08;Serial Management Interface&#xff09;&#xff0c;也可以称为MDIO接口&#xff08;Management Data Input/Output Interface&#xff09;。…

C语言——内存函数介绍和模拟实现

之前我们讲过一些字符串函数&#xff08;http://t.csdnimg.cn/ZcvCo&#xff09;&#xff0c;今天我们来讲一讲几个内存函数&#xff0c;那么可能有人要问了&#xff0c;都有字符串函数了&#xff0c;怎么又来个内存函数&#xff0c;这不是一样的么&#xff1f; 我们要知道之前…

Android问题记录

一 Android编程怎样用ICC校准颜色&#xff1f; 在Android编程中&#xff0c;ICC颜色校准通常是通过使用Color Management API进行的。以下是使用ICC校准颜色的步骤&#xff1a; 首先&#xff0c;确保你的设备支持色彩管理。你可以通过调用ColorManagement.isColorManagementSu…

华为原生 HarmonyOS NEXT 鸿蒙操作系统星河版 发布!不依赖 Linux 内核

华为原生 HarmonyOS NEXT 鸿蒙操作系统星河版 发布&#xff01;不依赖 Linux 内核 发布会上&#xff0c;余承东宣布&#xff0c;HarmonyOS NEXT鸿蒙星河版面向开发者开放申请。 申请链接 鸿蒙星河版将实现原生精致、原生易用、原生流畅、原生安全、原生智能、原生互联6大极致原…

MATLAB Fundamentals>>>Fill Missing Values

MATLAB Fundamentals>Preprocessing Data>Interpolating Missing Data> (1/4) Fill Missing Values This code sets up the activity. x [0 NaN 7 8 NaN 2 -3 NaN -8] plot(x,"s-","LineWidth",1.5) 任务1&#xff1a; Create a vector y th…

04 思维导图的方式回顾ospf

思维导图的方式回顾OSPF 1 ospf 领行学习思维导图 1.1 ospf 的工作过程 建立领据表同步数据库计算路由表1.2 ospf 的状态 1.3 ospf的报文 1.4 ospf的L

Arduino开发实例-LJ12A3-4-Z/BX 电感式接近传感器驱动

LJ12A3-4-Z/BX 电感式接近传感器驱动 文章目录 LJ12A3-4-Z/BX 电感式接近传感器驱动1、LJ12A3-4-Z/BX 电感式接近传感器介绍2、硬件准备及接线3、代码实现1、LJ12A3-4-Z/BX 电感式接近传感器介绍 接近传感器用于检测附近物体的存在。 LJ12A3-4-Z / BX 传感器有三个引脚,其中两…

ant-desgin的table的上移、下移

文章目录 html部分函数部分 html部分 <a-table :columns"columns" :data-source"dataList" :loading"listLoading" :pagination"false"><template #bodyCell"{ column, record, index }"><template v-if&qu…

修改并配置flutter不同平台的启动图标,很方便就可以修改,全平台支持

Flutter 启动器图标-一个包&#xff0c;简化了更新您的 Flutter 应用程序的启动器图标的任务。完全灵活&#xff0c;允许您选择什么平台&#xff0c;您希望更新的启动器图标&#xff0c;如果你想&#xff0c;选项保留您的旧启动器图标&#xff0c;以防您想恢复到未来的某个时候…

【腾讯云】您使用的腾讯云服务存在违规信息,请尽快处理

收到【腾讯云】您使用的腾讯云服务存在违规信息&#xff0c;请尽快处理&#xff0c;如何解决&#xff1f;在腾讯云服务器部署网站提示网站有违规信息如何处理&#xff1f;腾讯云百科txybk告诉各位站长&#xff0c;在腾讯网址安全中心申诉&#xff0c;申诉通过后截图上传给腾讯云…

Github操作网络异常笔记

Github操作网络异常笔记 1. 源由2. 解决2.1 方案一2.2 方案二 3. 总结 1. 源由 开源技术在国内永远是“蛋疼”&#xff0c;这些"政治"问题对于追求技术的我们&#xff0c;形成无法回避的障碍。 $ git pull ssh: connect to host github.com port 22: Connection ti…

微电网优化MATLAB:遗传算法(Genetic Algorithm,GA)求解微电网优化(提供MATLAB代码)

一、微网系统运行优化模型 微电网优化是指通过对微电网系统中各个组件的运行状态进行监测和调节&#xff0c;以实现微电网系统的高效运行和能源利用的最大化。微电网是由多种能源资源&#xff08;如太阳能、风能、储能等&#xff09;和负载&#xff08;如建筑、工业设备等&…

02--数据库事务

1、数据库事务 1.1 数据库事务介绍 事务&#xff1a;一组逻辑操作单元,使数据从一种状态变换到另一种状态。 事务处理&#xff08;事务操作&#xff09;&#xff1a;保证所有事务都作为一个工作单元来执行&#xff0c;即使出现了故障&#xff0c;都不能改变这种执行方式。当…

一句话讲清楚什么是CUDA,人人都能听懂的CUDA概念

通俗地说&#xff0c;CUDA是一种协助“CPU任务分发GPU并行处理”的编程模型/平台&#xff0c;用于加速GPU和CPU之间的计算。 也就是说CUDA通过CPU任务分发和GPU并行处理的方式&#xff0c;把计算任务通过CPU分发给GPU进行并行计算加速。而GPU并行计算的能力需要CUDA借助其自带…

axios query传数组参数的格式

在 Axios 中&#xff0c;当你需要传递数组参数时&#xff0c;可以使用以下几种方式进行格式化&#xff1a; 使用 paramsSerializer 将数组转换为逗号分隔的字符串&#xff1a; import axios from axios;import qs from qs;const arrayParams [param1, param2, param3];axios.…

Elasticsearch 中的 term、terms 和 match 查询

目录 term 查询 terms 查询 match 查询 注意事项 结论 Elasticsearch 提供了多种查询类型&#xff0c;用于不同的搜索需求。term、terms 和 match 是其中最常用的一些查询类型。下面分别介绍每种查询类型的用法和特点。 term 查询 term 查询用于精确值匹配。它通常用于关…

Java集合框架的基本接口

Java集合框架的基本接口主要包括以下几种&#xff1a; Collection&#xff1a;这是所有集合的根接口&#xff0c;定义了一些基本的操作&#xff0c;如添加、删除、检查元素等。 Set&#xff1a;Set 是一个不包含重复元素的集合。此接口的主要目的是确保元素的唯一性。 List&am…