Java学习笔记(多线程):CompetableFuture

本文是自己的学习笔记,主要参考资料如下
https://www.cnblogs.com/dolphin0520/p/3920407.html
JavaSE文档
https://blog.csdn.net/ThinkWon/article/details/102508721


  • 1、Overview
  • 2、重要参数
  • 3、主要方法
    • 3.1、创建实例,获取返回值
    • 3.2、线程执行顺序相关

1、Overview

CompletableFuture可以处理任务的执行顺序,比如A执行结束后再开始B,或者A和B同时进行,两者都结束后再开始C。

2、重要参数

CompletableFuture中有三个重要参数,他们的作用和Thread中的run方法一样,用来定义线程的行为。

他们的不同点知识入参和返回结果的不同。

  • Supplier<U>:没有入参,有返回结果
  • Consumer<T>:有入参,没有返回结果
  • Function<T,U>:有入参,有返回结果

比如我们写一个线程任务,参数是Supplier,那就不能传参,但是有返回值,就像callable()方法一样。

CompletableFuture<String> a = CompletableFuture.supplyAsync(() -> {System.out.println("第一个异步任务开始执行");System.out.println("第一个异步任务执行结束");return "supply example";
});
System.out.println(a.join());
Thread.sleep(5000L);

返回结果
在这里插入图片描述

3、主要方法

3.1、创建实例,获取返回值

一般用静态方法创建实例,有下面两种创建实例的方法,区别是是否有返回值。

  • supplyAsync():传入Supplier类型,可以有返回值。
  • runAsync():传入Runable类型,无返回值。

这里以supplyAsync为例

public static void supplysync() throws Exception{// 不指定线程池,默认用ForkJoinPool,这个线程池的线程都是守护线程CompletableFuture<Void> result = CompletableFuture.supplyAsync(() -> {System.out.println("异步任务开始执行");System.out.println("异步任务执行结束");return "返回执行结果";})System.out.println(result.join());// get()和join()一样,但是join()自己处理了异常,get()需要处理异常System.out.println(result.get());Thread.sleep(20000L);}

在这里插入图片描述

要注意,supplyAsync()runAsync()都两个重载方法,即是否传入线程池。

public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier);
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor);

如果不传入线程池,那默认使用ForkJoinPool作为线程池处理线程,而这个线程池的线程全是守护线程,所以测试代码中必须让主线程沉睡一会,免得主线程过早结束导致守护线程跟着结束让我们看不到测试结果。


3.2、线程执行顺序相关

CompletableFuture提供了下面几种控制线程执行顺序的方法,他们各自都有多个重载方法,这里不一一列举了。

下面两条规则比较普遍。

  • 几乎所有的方法都有个同名加Async后缀的方法,比如thenSupply()有一个thenSupplyAsync(),这两者没有功能上的不同,只是后者可以传线程池。

  • 一些方法有加Both后缀,比如runAfter()有个runAfterBoth(),前者表示等某个线程结束后这个线程再运行,后者则是等多个线程都结束后这个线程再运行。

  • 在我之后执行:thenApply()thenAccept()thenRun()thenApplyAsync()等都是,只是能否传参,是否有返回值和使用的线程池不同而已。

  • 在我之前:runAfter()

  • 和我同时: thenCombine()

  • 有一个结束我就开始:applyToEither()

public static void thenSupply() throws Exception{CompletableFuture<String> a = CompletableFuture.supplyAsync(() -> {System.out.println("第一个异步任务开始执行");System.out.println("第一个异步任务执行结束");return "supply example";}).thenApply(b -> {System.out.println("第二个异步任务开始执行");System.out.println("第二个异步任务执行结束");return "thenApply example";});System.out.println(a.join());Thread.sleep(5000L);
}

在这里插入图片描述

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

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

相关文章

Linux系统安装Lua语言及Lua外部库

安装Lua Lua语言是一种轻量级、高效且可扩展的脚本语言&#xff0c;具有简洁易学的语法和占用资源少的特点。它支持动态类型&#xff0c;提供了丰富的表达式和运算符&#xff0c;同时具备自动垃圾回收机制和跨平台性。Lua语言易于嵌入到其他应用程序中&#xff0c;并可与其他语…

查询DBA_TEMP_FILES报错,删除临时表空间报错ORA-60100

SYMPTOMS 查询DBA_TEMP_FILES报错如下图 ORA-01157: cannotidentify/ock data fle 201 -see DBWR trace fle ORA-01110: data fle 20 1: D:APPADMINISTRATORIORADATA MARTIDATAFILE 01157,00000-"cannotidentify/ock data fle %s -see DBWR trace fle"*Cause: The b…

安卓免费短剧大全v1.0.2/全部无需VIP实时更新全平台短剧

在当今社会&#xff0c;时间成为了许多人最为宝贵的资源。忙碌的工作与繁重的日常事务&#xff0c;常常让我们难以拨出时间沉浸于长篇大幅的影视作品中。对于那些热爱剧情、渴望在生活中点缀一抹戏剧色彩的朋友们而言&#xff0c;这无疑是一种挑战。 然而&#xff0c;随着免费…

高通安卓12-在源码中查找应用的方法

1.通过搜索命令查找app 一般情况下&#xff0c;UI上看到的APP名称会在xml文件里面定义出来&#xff0c;如 搜索名字为WiGig的一个APP 执行命令 sgrep "WiGig" 2>&1|tee 1.log 将所有的搜索到的内容打印到log里面 Log里面会有一段内容 在它的前面是这段内…

尚品汇-(七)

&#xff08;1&#xff09;在网关中实现跨域 全局配置类实现 包名&#xff1a;com.atguigu.gmall.gateway.config 创建CorsConfig类 Configuration public class CorsConfig {Beanpublic CorsWebFilter corsWebFilter(){// cors跨域配置对象CorsConfiguration configuration…

操作符详解(上) (C语言)

操作符详解&#xff08;上&#xff09; 一. 进制转换1. 二进制2. 二进制的转换 二. 原码 补码 反码三. 操作符的分类四. 结构成员访问操作符1. 结构体的声明2. 结构体成员访问操作符 一. 进制转换 1. 二进制 在学习操作符之前&#xff0c;我们先了解一些2进制、8进制、10进制…

mybatis的SQL打印说明

打印SQL记录子类: org.apache.ibatis.logging.jdbc.PreparedStatementLogger extends BaseJdbcLogger implements InvocationHandler org.apache.ibatis.logging.jdbc.ConnectionLogger extends BaseJdbcLogger implements InvocationHandler org.apache.ibatis.logging.jdbc.…

点云处理实战 PCL求解点云表面曲率

目录 一、什么是曲率 二、曲率计算过程 三、pcl 求解点云局部曲率 四、思考?为何曲率计算会使用协方差矩阵? 五、推荐阅读 一、什么是曲率 曲率是几何学中用来描述曲线或曲面形状变化的一个量。它反映了曲线或曲面的弯曲程度。在不同的上下文中,曲率的定义和计算方式有…

go中的方法 func-----数据类型

本文是java学习者学go种产生的容易记混点的笔记,所以有其他编译语言的基础更好 go的方法有点像js 基础 func main() {fmt.Println("Starting")var p *string new(string)*p "hello world"demo : "demo"fmt.Println(*&demo) //这样既然也…

sys.stdin对象——实现标准输入

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 sys.stdin是一个标准化输入对象&#xff0c;可以连续输入或读入文件所有内容&#xff0c;不结束&#xff0c;不能直接使用。输入完成后&am…

Springboot整合Zookeeper分布式组件实例

一、Zookeeper概述 1.1 Zookeeper的定义 Zookeeper是一个开源的分布式协调服务&#xff0c;主要用于分布式应用程序中的协调管理。它由Apache软件基金会维护&#xff0c;是Hadoop生态系统中的重要成员。Zookeeper提供了一个高效且可靠的分布式锁服务&#xff0c;以及群集管理…

深入探讨C++的高级反射机制(2):写个能用的反射库

在现代软件开发中&#xff0c;反射是一种强大的特性&#xff0c;它可以支持程序在运行时查询和调用对象的属性和方法。 但是在C中&#xff0c;没有内置的反射机制。我们可以通过一些巧妙的技术模拟反射的部分功能。 上一篇文章写了个简单的反射功能&#xff0c;这回完善一下&a…

Java 8 新特性:Lambda表达式让你的代码焕然一新——掌握它,让编程变得轻松又高效!

前言 Java 8 是 Java 发展史上的一次重要里程碑。作为企业级开发语言&#xff0c;它在性能和功能上做了巨大的提升。这其中&#xff0c;Lambda表达式是一个关键的新特性&#xff0c;它为 Java 语言带来了函数式编程的概念。本篇文章将深入探讨Lambda表达式&#xff0c;并结合热…

社区团购小程序开发

在快节奏的现代生活中&#xff0c;人们越来越追求便利与效率。社区团购小程序应运而生&#xff0c;以其独特的优势成为连接社区居民与优质商品的重要桥梁。本文将探讨社区团购小程序的特点、优势以及未来发展趋势&#xff0c;为大家揭示这一新型购物模式的魅力。 社区团购小程序…

React学习(二)——状态(数据)与状态修改

useState 在React中&#xff0c;useState 是一个非常重要的Hook&#xff0c;它允许你在函数组件中添加“状态”&#xff08;state&#xff09;。在传统的React类组件中&#xff0c;我们使用this.state来管理和更新组件的状态。然而&#xff0c;在函数组件中&#xff0c;由于它们…

Linux-笔记 全志平台休眠功能初探

前言 全志平台支持的休眠功能主要包括两种模式&#xff1a;休眠模式和待机模式。这两种模式用于降低设备的功耗&#xff0c;并在需要时快速恢复工作状态。由于平台为T113&#xff0c;所以可以很方便的使用RTC来做唤醒源。唤醒源指的是能够让系统从休眠状态恢复到工作状态的信号…

华为DCN技术:M-LAG

M-LAG&#xff08;Multichassis Link Aggregation Group&#xff09;即跨设备链路聚合组&#xff0c;是一种实现跨设备链路聚合的机制。M-LAG主要应用于普通以太网络、VXLAN和IP网络的双归接入&#xff0c;可以起到负载分担或备份保护的作用。相较于另一种常见的可靠性接入技术…

ArkTS开发系列之Web组件的学习(2.9)

上篇回顾&#xff1a;ArkTS开发系列之事件&#xff08;2.8.2手势事件&#xff09; 本篇内容&#xff1a; ArkTS开发系列之Web组件的学习&#xff08;2.9&#xff09; 一、知识储备 Web组件就是用来展示网页的一个组件。具有页面加载、页面交互以及页面调试功能 1. 加载网络…

ARM架构简明教程

目录 一、ARM架构 1、RISC指令集 2、ARM架构数据类型的约定 2.1 ARM-v7架构数据类型的约定 2.2 ARM-v8架构数据类型的约定 3、CPU内部寄存器 4、特殊寄存器 4.1 SP寄存器 4.2 LR寄存器 4.3 PC寄存器 二、汇编 1、汇编指令&#xff08;常用&#xff09; 2、C函数的…

平凉小果子,平凡中的惊艳味道

平凉美食小果子&#xff0c;这看似平凡的名字背后&#xff0c;藏着无数平凉人的美好回忆。它不仅仅是一种食物&#xff0c;更是一种情感的寄托&#xff0c;一种文化的传承。小果子的制作过程看似简单&#xff0c;实则蕴含着深厚的功夫。选用优质的面粉作为主要原料&#xff0c;…