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.mzph.cn/news/861306.shtml

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

相关文章

大自然高清风景视频无水印素材在哪下载?下载视频素材网分享

在视频创作领域&#xff0c;一段高清的风景视频可以极大地提升你的作品质感。无论是作为背景、过渡片段还是主要内容&#xff0c;优质的风景视频素材都是必不可少的。然而&#xff0c;寻找既高清又无水印的风景视频素材并非易事。为了帮助大家轻松获取这类素材&#xff0c;我整…

牛客周赛 Round 48 解题报告 | 珂学家

前言 题解 这场感觉有点难&#xff0c;D完全没思路, EF很典&#xff0c;能够学到知识. E我的思路是容斥贡献&#xff0c;F很典&#xff0c;上周考过一次&#xff0c;引入虚拟节点质数(有点像种类并查集类似的技巧). 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 …

Marin说PCB之total etch length规则知多少?

魔都上海最近迎来了一轮梅雨季节了&#xff0c;小编我上周就已经提前把被子衣服袜子都晒了一遍&#xff0c;省的后面一段时间下雨就不能晒了。这种阴雨绵绵的天气当然在家里睡觉最舒服了&#xff0c;上周留正当我在家里夏眠的时候&#xff0c;突然被一阵手机铃声吵醒了&#xf…

代码签名证书:保护你的软件,就像保护你的宝贝

Hey&#xff0c;大家好&#xff01;今天我们来聊聊一个听起来可能有点技术宅&#xff0c;但实际上超级重要的东西——代码签名证书。别担心&#xff0c;我会用最简单易懂的话来解释它&#xff0c;保证你看完这篇文章后&#xff0c;能对代码签名证书有个全新的认识&#xff01; …

苹果Mac安装adobe软件报错“installer file may be damaged”解决方案

最近Mac电脑系统的有小伙伴在安装PS、AI、AE、PR等软件&#xff0c;出现了一个错误&#xff0c;让人头疼不已&#xff0c;苦苦找寻&#xff0c;也找不到完美的解决方法。让我们来一起看看吧&#xff01; 很多小伙伴都喜欢苹果电脑&#xff0c;但是在安装外来软件时&#xff0c;…

Java后端 || ElementUI 显示后端树形表格数据

文章目录 1、前端源码2、数据库设计3、后端设计3.1、实体类3.2、Controller层3.3、具体树形列表后端代码实现 1、前端源码 ElementUI Table 链接 在此链接中找到 树形数据与懒加载 查看其JS源码&#xff0c;可知&#xff0c;每个菜单节点的子节点存放于children字段中&#x…

信息学奥赛初赛天天练-36-CSP-J2021阅读程序-ASCII、运算符优先级、二进制补码存储、模拟算法应用

PDF文档公众号回复关键字:20240626 2021 CSP-J 阅读程序2 1 阅读程序(判断题1.5分 选择题3分 共计40分 ) #include<stdio.h> #include<string.h>char base[64]; char table[256]; char str[256]; char ans[256];void init() {for(int i0;i<26;i) base[i]Ai;fo…

MySQL之可扩展性(四)

可扩展性 向外扩展 分片?还是不分片&#xff1f; 这是一个问题&#xff0c;对吧&#xff1f;答案很简单:如非必要&#xff0c;尽量不分片。首先看是否能通过性能调优或者更好的应用或数据库设计来推迟分片。如果能足够长时间地推迟分片&#xff0c;也许可以直接购买更大地服…

黑马程序员——Spring框架——day09——linux初级

目录&#xff1a; 前言 什么是Linux&#xff1f;为什么要学Linux 企业用人要求个人发展需要学完Linux能干什么 1).环境搭建2).常用命令3).安装软件4).项目部署小结2.Linux简介 主流操作系统Linux发展历史Linux系统版本Linux安装 安装方式介绍安装VMware安装Linux网卡设置安装S…

flink 处理函数和流转换

目录 处理函数分类 概览介绍 KeydProcessFunction和ProcessFunction 定时器TimeService 窗口处理函数 多流转换 分流-侧输出流 合流 联合&#xff08;Uniion&#xff09; 连接&#xff08;connect&#xff09; 广播连接流&#xff08;BroadcatConnectedStream&#xf…

数据结构——

1. 什么是并查集&#xff1f; 在计算机科学中&#xff0c;并查集&#xff08;英文&#xff1a;Disjoint-set data structure&#xff0c;直译为不数据结构交集&#xff09;是一种数据结构&#xff0c;用于处理一些不交集&#xff08;Disjoint sets&#xff0c;一系列没有重复元…

6毛钱SOT-23封装28V、400mA 开关升压转换器,LCD偏置电源和白光LED应用芯片TPS61040

SOT-23-5 封装 TPS61040 丝印PHOI 1 特性 • 1.8V 至 6V 输入电压范围 • 可调节输出电压范围高达 28V • 400mA (TPS61040) 和 250mA (TPS61041) 内部开关电流 • 高达 1MHz 的开关频率 • 28μA 典型空载静态电流 • 1A 典型关断电流 • 内部软启动 • 采用 SOT23-5、TSOT23…

input()函数——输入

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 input()函数可以提示并接收用户的输入&#xff0c;将所有的输入按照字符串进行处理&#xff0c;并返回一个字符串&#xff0c;input()函数的…

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

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

modelsim做后仿真的一点思路

这是以TD_5.6.3_Release_88061生成的网表文件&#xff08;其他工具生成的网表文件类似&#xff09;&#xff0c;与modelsim联合进行门级仿真的样例&#xff0c;时序仿真与门级仿真的方法类似&#xff0c;只是增加了标准延时文件。 1、建立门级仿真工程 将门级网表和testbench添…

vivado SLR

描述 超级逻辑区&#xff08;SLR&#xff09;是包含在堆叠硅中的单个FPGA芯片 互连&#xff08;SSI&#xff09;设备。堆叠式硅互连&#xff08;SSI&#xff09;技术使用无源硅 具有微凸块和硅通孔&#xff08;TSV&#xff09;的内插器&#xff0c;用于组合多个FPGA管芯 切片&a…

【ARM Trace32(劳特巴赫) 使用介绍 2.7 -- bat 脚本传参数给 trace32 cmm 脚本】

请阅读【Trace32 ARM 专栏导读】 文章目录 bat 脚本传参数给 trace32脚本可变参数传入CMM 脚本接收参数运行BAT脚本bat 脚本传参数给 trace32脚本 在使用 Trace32 的过程中,如果每次都是通过GUI 界面来操作,是习惯使用命令行工作的人所不能忍受的!!!,那么能不同通过脚本…

如何下载植物大战僵尸杂交版,最全攻略来了

《植物大战僵尸杂交版》由热爱原版游戏的B站UP主“潜艇伟伟迷”独立开发&#xff0c;带来了创新的游戏体验。如果你是策略游戏的爱好者&#xff0c;下面这份全面的下载和游玩攻略将是你的理想选择。 游戏亮点&#xff1a; 杂交植物系统&#xff1a;结合不同植物特性&#xff0c…

CMakeList.txt 与makefile文件介绍

在C 项目中&#xff0c; 我们经常可以看到CMakeList.txt 文件和makefile文件&#xff0c; 那么它们分别有什么用呢&#xff1f; 下面的图示很好地解释了它们的作用以及两者之间的关系。

021.合并两个有序链表,递归和遍历

题意 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 难度 简单 标签 链表、排序 示例 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[]…