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);
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三十九篇:UML与SysML:掌握现代软件和系统架构的关键

UML与SysML&#xff1a;掌握现代软件和系统架构的关键 1. 引言 1.1 为什么系统设计如此关键 在当今快速发展的技术环境中&#xff0c;系统设计的重要性不言而喻。无论是软件开发还是复杂的系统工程&#xff0c;良好的设计是确保项目成功的基石。系统设计不仅关系到功能的实现…

day38动态规划part01| 理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

**理论基础 ** 无论大家之前对动态规划学到什么程度&#xff0c;一定要先看 我讲的 动态规划理论基础。 如果没做过动态规划的题目&#xff0c;看我讲的理论基础&#xff0c;会有感觉 是不是简单题想复杂了&#xff1f; 其实并没有&#xff0c;我讲的理论基础内容&#xff0c;…

状态压缩动态规划(State Compression DP)算法详解

状态压缩动态规划&#xff08;State Compression DP&#xff09;是一种高效解决组合优化问题的技术&#xff0c;特别适用于那些状态空间较大且可以用二进制表示的情况。本文将详细讲解状态压缩DP的原理、常用的位运算技巧、以及具体的例题分析。 原理概述 状态压缩DP的核心思…

HTML5实现字母记忆配对游戏

HTML5实现字母记忆配对游戏 这个小游戏具有重新开始功能和难度设置功能。 “重新开始“按钮&#xff0c;点击它或完成一局游戏后&#xff0c;会自动开始新游戏。 下拉列表框&#xff0c;&#xff0c;难度设置&#xff0c;包含简单、中等和困难三个选项。 简单&#xff1a;8…

《梦醒蝶飞:释放Excel函数与公式的力量》5.4 Match函数

5.4 Match函数 5.4.1 match函数的概念 MATCH函数是Excel中的一个查找和引用函数&#xff0c;它用于在数据表或数组中搜索指定项&#xff0c;并返回该项在数组中的相对位置。以下是MATCH函数的几个关键概念&#xff1a; 1)查找值&#xff08;Lookup Value&#xff09; 这是…

Web 权限管理最佳实践:如何提升用户满意度与应用安全性?

引言 在当今数字化时代&#xff0c;Web应用的功能和复杂性不断增加&#xff0c;用户对在线服务的期望也在不断提升。为了提供丰富的用户体验&#xff0c;许多Web应用需要访问用户的个人信息或设备功能&#xff0c;如地理位置、摄像头和麦克风等。这些权限访问在提升应用功能的…

移动Web开发实战内容要点!!!

移动web开发 目录 移动web开发 第一章、Web开发标准与网页网站制作介绍 1.1Web开发标准 1.2网页基本构成元素 第二章、Web开发技术基础 2.1HTML的主要特点&#xff1a; 2.2HTML基本知识 2.3CSS样式 2.4JavaScript 第三章、打造移动Web应用程序 3.1为什么Android会成…

AI-智能体基础设施

个性化记忆需要世界模型来协助构建 业界有一个精简的Agent表达公示&#xff0c;即&#xff1a;Agent大模型&#xff08;LLM&#xff09;记忆&#xff08;Memory&#xff09;主动规划&#xff08;Planning&#xff09;工具使用&#xff08;Tool Use&#xff09;。基于该公式&am…

植物大战僵尸杂交版v2.1最新直装版,苹果+安卓+PC+防闪退工具+修改工具+高清工具+通关存档整合包更新

今天我要和各位聊聊一款让全网疯狂的游戏——《植物大战僵尸杂交版》。这可不是简单的游戏&#xff0c;它可是让B站的UP主“潜艇伟伟迷”一夜成名的大作&#xff0c;让无数玩家为之疯狂的魔改神作&#xff01; 记得2009年&#xff0c;《植物大战僵尸》横空出世&#xff0c;那时…

单片机学习记录

一&#xff0c;单片机及开发板介绍 1&#xff0c;基本介绍 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(…

深度相机辅助导航避障(三):地面点云滤除

前面的章节介绍了坐标变换,以及如何设置深度相机的坐标变换。那就可以很直观从机器人的坐标系对深度相机扫描到的障碍物点云进行处理。 在实际应用中,机器人正确估计周围地形,对于道路的可通过性、路径规划和障碍物检测等方面都很重要。那么在获取深度相机点云数据后就得准…

Qt入门小项目 | 实现腾讯会议登陆界面

文章目录 一、手写代码实现腾讯会议登陆界面二、使用UI设计器实现腾讯会议登陆界面 一、手写代码实现腾讯会议登陆界面 使用Qt控件与布局实现腾讯会议登陆界面。 示例&#xff1a; loginInCode.h&#xff1a; #pragma once#include <QtWidgets/QDialog> #include <QV…

安装zabbix时报错Could not resolve host: mirrors.huaweicloud.com;Unknown error解决办法

目录 1、问题原因 2、解决办法 3、知识拓展 DNS的区别 DNS配置文件解析 域名解析过程 4、书籍推荐 当安装Zabbix server&#xff0c;Web前端&#xff0c;agent时出现&#xff1a; [rootsc-zabbix-server ~]# yum install zabbix-server-mysql zabbix-agent安装过程中会出…

Token详解

一&#xff1a;Token是什么 token是具有访问权限的令牌&#xff0c;其本质是一串字符串。 如何创建token 用户在登录页面&#xff0c;输入账号和密码能够成功登录后&#xff1b;由后端签发并返回 token作用 用来判断用户当前的登录状态&#xff0c;根据当前用户登录状态给…

OceanBase 4.X-2F1A 仲裁高可用方案初探

作者&#xff1a;郑增权&#xff0c;爱可生 DBA 团队成员&#xff0c;OceanBase 和 MySQL 数据库技术爱好者。 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 本文约 1500 字&#xff0c;预计阅读需要 5 分钟。 背景 对…

CS与MSF的权限互相传递/mimikatz抓取windows 2012明文密码

目录 CS和MSF的简单介绍 Metasploit Cobalt Strike 1、CS权限传递到MSF 2、MSF权限传递到CS 3、使用mimikatz抓取明文密码 通过修改注册表用户重新登录后抓取明文密码 今天的任务是两个 一个是CS与MSF的权限互相传递一个是抓取windows2012的明文密码 那就分别来完成 …

printf趣味代码,打印图案

文章目录 1.打印佛祖2.打印猫猫 (闪烁效果) 1.打印佛祖 #include <stdio.h>void budda_bless(){printf("///\n\ // _ooOoo_ //\n\ // o8888888o //\n\ // …

SpringBoot全局配置文件里的配置项

SpringBoot核心配置文件里可以配置的配置项&#xff0c;非常非常多&#xff01;Spring Boot Reference Guide靠后的附件里看到所有配置项和说明. 有关配置项&#xff0c;我们除了知道在哪里查询具体配置项以外&#xff0c;我们还应该知道一些细节知识点: ① SpringBoot给我们…

2024广东省职业技能大赛云计算赛项实战——集群部署GitLab

集群部署GitLab 前言 题目是这样的&#xff1a; 在Kubernetes集群中新建命名空间gitlab-ci&#xff0c;将GitLab部署到该命名空间下&#xff0c;Deployment和Service名称均为gitlab&#xff0c;以NodePort方式将80端口对外暴露为30880&#xff0c;设置GitLab服务root用户的密…

Python 高级编程:文件操作与错误处理

在前几篇文章中&#xff0c;我们介绍了Python的基本语法、函数和模块以及面向对象编程。这些知识对于大部分日常编程问题已经足够&#xff0c;但对于需要分析大数据的人来说&#xff0c;这些还不够。本章将介绍Python的文件操作以及错误处理与调试。 目录 文件操作读文件写文…