CompletableFuture工具类使用

news2024/11/26 15:47:35

CompletableFuture工具类可以帮助实现Java并发编程中的任务编排

以上除了join用于阻塞调用该发放的线程并且接受CompletableFuture的返回值以外其它方法皆有Async异步和Executor指定线程池选项

对于supply,run,apply,accept的区别在于函数式编程的接口类型不同:

  • supply: Supplier<T> supplier => T get()
  • run:  Runnable runnable => void run()
  • apply:  Function<T, R> => apply(T t)
  • accept: Consumer<T> => void accept(T t)

对于以上方法,根据接受参数不同分为两类,一类参数接受如supply,run,apply,accept接口的实现类,另一类参数接受新的CompletableFuture:

FunctionInterfaceCompletableFuture
supplyAsyncthenCompose  
runAsyncthenCombine 
thenApplythenAcceptBoth
thenAcceptrunAfterBoth
thenRunapplyToEither
acceptEither
runAfterEither

thenCompose用于先执行A再执行B

thenCombine,thenAcceptBoth,runAfterBoth用于A,B同时执行

applyToEither,acceptEither,runAfterEither用于A,B谁先执行完就跳到C

 exceptionally,handle,whenComplete用于在并发编程中处理结果和异常:

exceptionally:

该方法仅处理异常情况:发生异常时,不会把异常抛出,而是由exceptionally处理结果返回

public static CompletableFuture exceptionally(int a, int b){
    return CompletableFuture.supplyAsync(() -> a/b)
            .exceptionally(ex -> {
                System.out.println("ex:\t"+ex.getMessage());
                return 0;
            });
}

handle:

处理上一阶段返回值和异常,不会把异常抛出,而是由handle处理结果返回

public class CreateThread_FutureTask {
    public static void main(String[] args) {
        CompletableFuture<String> ctf = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(1000);
                return "1";
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }).applyToEither(CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(50);
                return String.valueOf(1/0);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }), str -> {
            return str;
        }).handle((str,ex)->{
            if(ex!=null){
                return ex.getMessage();
            }
            else{
                return str;
            }
        });
        System.out.println(ctf.join());
        System.out.println("主线程能继续执行");
    }
}

whenComplete:

处理上一阶段返回值和异常,会把异常抛出

public static CompletableFuture whenComplete(int a, int b){
    return CompletableFuture.supplyAsync(() -> a/b)
            .whenComplete((result, ex) -> {
                if (null != ex) {
                    System.out.println("whenComplete error:\t"+ex.getMessage());
                }
            });
}

CompletableFuture.allOf和anyOf

allOf:接受CompletableFuture<?>...ctfs,等待全部执行完毕

anyOf:接受CompletableFuture<?>...ctfs,等待任意一个执行完毕

CompletableFuture[] dishes = IntStream.rangeClosed(1, 10)
                .mapToObj(i -> new Dish("菜" + i, 1L))
                .map(dish -> CompletableFuture.runAsync(dish::make))
                .toArray(CompletableFuture[]::new);
CompletableFuture.allOf(dishes).join();
System.out.println("菜全都做好了");

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

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

相关文章

【刷题汇总--游游的you、腐烂的苹果、孩子们的游戏(圆圈中最后剩下的数)】

C日常刷题积累 今日刷题汇总 - day0051、游游的you1.1、题目1.2、思路1.3、程序实现 - 蛮力法1.4、程序实现 - 贪心(优化) 2、腐烂的苹果2.1、题目2.2、思路2.3、程序实现 - bfs 3、孩子们的游戏(圆圈中最后剩下的数)3.1、题目3.2、思路3.3、程序实现 -- 环形链表3.4、程序实现…

桌面保存的Word文件删除怎么找回?超实用的三个方法?

在日常工作和学习中&#xff0c;我们经常会使用Word文档进行文字编辑和文件保存。但是&#xff0c;有时由于操作失误或系统故障&#xff0c;我们会不小心将存放在电脑桌面重要的Word文件删除了。导致无法挽回的损失&#xff0c;但幸运的是&#xff0c;有一些方法可以帮助我们找…

当火热的Mamba遇到火热的YOLO,会发生怎么样的反应吗?

作者&#xff1a;浙江师范大学 论文地址&#xff1a;https://arxiv.org/pdf/2406.05835 代码地址&#xff1a;https://github.com/HZAI-ZJNU/Mamba-YOLO 目录 前言一、摘要二、介绍二、相关工作2.1 实时目标检测器2.2 端到端的目标检测器2.3 视觉状态空间模型 三 方法3.1 基础知…

Victor CMS v1.0 SQL 注入漏洞(CVE-2022-26201)

前言 CVE-2022-26201 是 Victor CMS v1.0 中发现的一个 SQL 注入漏洞。该漏洞允许攻击者通过特制的 SQL 查询注入到应用程序中&#xff0c;从而访问或操作数据库中的数据。以下是详细信息&#xff1a; 漏洞描述&#xff1a; 类型&#xff1a;SQL 注入 (SQL Injection)影响版本…

第六篇——谋攻篇:上兵伐谋,不是说打仗要用计谋

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 战术层面的东西&#xff0c;即便战略对了&#xff0c;战术不对&#xff0…

二重积分 - 包括计算方法和可视化

二重积分 - 包括计算方法和可视化 flyfish 计算在矩形区域 R [ 0 , 1 ] [ 0 , 2 ] R [0, 1] \times [0, 2] R[0,1][0,2] 下&#xff0c;函数 z 8 x 6 y z 8x 6y z8x6y 的二重积分。这相当于计算曲面 z 8 x 6 y z 8x 6y z8x6y 与 xy 平面之间的体积。 二重积分…

劲爆!华为享界两款新车曝光,等等党有福了

文 | AUTO芯球 作者 | 雷慢 劲爆啊&#xff0c;北汽的一份环境影响分析报告&#xff0c; 不仅曝光了享界S9的生产进展&#xff0c; 还泄露了自家的另两款产品&#xff0c; 第一款是和享界S9同尺寸的旅行车&#xff0c; 我一看&#xff0c;这不是我最喜欢的“瓦罐”吗&…

20.【C语言】初识结构体(重要)

定义&#xff1a;由一批数据组合而成的结构型数据 作用&#xff1a;描述复杂对象&#xff0c;创建新的类型 格式&#xff1a; struct 对象 { …… } 介绍. 用法&#xff1a;结构体变量.成员变量 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> struct hotal…

达梦数据库的系统视图v$auditrecords

达梦数据库的系统视图v$auditrecords 在达梦数据库&#xff08;DM Database&#xff09;中&#xff0c;V$AUDITRECORDS 是专门用来存储和查询数据库审计记录的重要系统视图。这个视图提供了对所有审计事件的访问权限&#xff0c;包括操作类型、操作用户、时间戳、目标对象等信…

浅谈反射机制

1. 何为反射&#xff1f; 反射&#xff08;Reflection&#xff09;机制指的是程序在运行的时候能够获取自身的信息。具体来说&#xff0c;反射允许程序在运行时获取关于自己代码的各种信息。如果知道一个类的名称或者它的一个实例对象&#xff0c; 就能把这个类的所有方法和变…

亚马逊跟卖ERP的自动调价功能,能够简易地批量设置价格规则。

跟卖的智能调价 跟卖智能调价简单说是可以上调&#xff0c;下调就是怎么说&#xff1f;上调就是它根靠根据市场最低的价格情况进行去上调。 然后添加指定条件&#xff0c;到工具栏找到指定条件&#xff0c;点击添加指定条件。 然后选择店铺&#xff0c;比如选择店铺&#xf…

【C++】认识使用string类

【C】STL中的string类 C语言中的字符串标准库中的string类string类成员变量string类的常用接口说明成员函数string(constructor构造函数)~string(destructor析构函数)默认赋值运算符重载函数 遍历string下标[ ]迭代器范围for反向迭代器 capacitysizelengthmax_sizeresizecapaci…

软件测试之接口自动化测试实战(完整版)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 自从看到阿里云性能测试 PTS 接口测试开启免费公测&#xff0c;就想着跟大家分享交流一下如何实现…

Vue 前端修改页面标题无需重新打包即可生效

在public文件夹下创建config.js文件 index.html页面修改 其他页面的标题都可以用window.title来引用就可以了&#xff01;

力扣53. 最大子数组和(动态规划)

Problem: 53. 最大子数组和 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.定义dp数组&#xff1a;dp[i]表示以nums[i]为结尾的子序列的最大子序列和&#xff1b; 2.状态初始化&#xff1a;dp[0] nums[0],表示以nums[0]为结尾的子序列的最大子序列和为nums[0]…

自己动手实现语音识别

声音的本质是震动,震动的本质是位移关于时间的函数,波形文件(.wav)中记录了不同采样时刻的位移。 通过傅里叶变换,可以将时间域的声音函数分解为一系列不同频率的正弦函数的叠加,通过频率谱线的特殊分布,建立音频内容和文本的对应关系,以此作为模型训练的基础。 语音mfc…

面向对象案例:电影院

TOC 思路 代码 结构 具体代码 Movie.java public class Movie {//一共七个private int id;private String name;private double price;private double score;private String director;private String actors;private String info;//get和setpublic int getId() {return id;…

Nuxt3 的生命周期和钩子函数(十一)

title: Nuxt3 的生命周期和钩子函数&#xff08;十一&#xff09; date: 2024/7/5 updated: 2024/7/5 author: cmdragon excerpt: 摘要&#xff1a;本文详细介绍了Nuxt3中几个关键的生命周期钩子和它们的使用方法&#xff0c;包括webpack:done用于Webpack编译完成后执行操作…

Git-如何修改git项目的远程仓库地址

前言 因为工作需要&#xff0c;现在准备将原来的git项目远程仓库地址修改为另一个&#xff0c;那么需要如何做呢&#xff1f; 第一种 1、首先需要在github中新建一个repository 2、创建之后会有一个对应的远程仓库地址&#xff0c;复制这个新建repository的url备用 3、找…

ython 使用 cx_Freeze 打包,不想要打包文件中能直接看到依赖的代码,如何处理

背景&#xff1a;因为使用 cx_Freeze 打包时&#xff0c;添加需要依赖的文件 cx_Freeze 是一个用于将 Python 程序打包成独立可执行文件的工具&#xff0c;支持多个平台。当你需要打包包含多个 .py 文件的项目时&#xff0c;你可以通过编写一个 setup.py 文件来指定哪些模块应…