Java并发编程—CompletableFuture的常用方法(建议收藏)

news2024/9/23 9:30:31

    在过去的一段时间里,博主一直在给大家分享多线程并发编程里面的关键CompletableFfuture类的各种技术点,并发编程作为java开发里面关键点之一,也是大家向上提升重要的一点;对于CompletableFuture的学习一定要学到位,前面给大家分享了很多的知识点,这里分享一下CompletableFuture里面的关键方法的用法,码文不易,希望大家多多支持!

 一、获取结果和主动触发计算的方法

        1、T get() {}方法:

                功能:它能获取异步线程里面执行完成的结果

/*1、get()方法的使用*/
        System.out.println(CompletableFuture.supplyAsync(() -> {
            return 1;
        }).get());
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

        2、T get(long timeout, TimeUnit unit){}方法:

                功能:get()方法需要等待线程执行完后才能获取到,这个是设置了一个等待时间,如果在设定的等待时间没获取到,就报错;

        /*2、get(long timeout, TimeUnit unit)方法的使用*/
        System.out.println(CompletableFuture.supplyAsync(() -> {
            return 2;
        }).get(2, TimeUnit.SECONDS));
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

        3、T join(){}方法:

                功能:和get()的功能一样,只是这个方法不需要抛异常

/*3、public T join()方法的使用*/
        System.out.println(CompletableFuture.supplyAsync(() -> {
            return 3;
        }).join());	
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

        4、T getNow(T valueIfAbsent){}方法

                功能:也是获取结果的方法,在主程序走到方法执行的时候,异步程序如果运行完了就返回线程里面返回的结果,如果没运行完,程序不会报错,会返回一个托底数据valueIfAbsent

/*4、public T getNow(T valueIfAbsent)方法的使用*/
        CompletableFuture<Integer> async = CompletableFuture.supplyAsync(() -> {
            return 4;
        });
        TimeUnit.SECONDS.sleep(2);
        /*也是获取结果的方法,在主程序走到这一行的时候,异步程序如果运行完了就返回4,如果没运行完,不会报错,会返回一个托底数据2*/
        System.out.println(async.getNow(2));
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

        5、public boolean complete(T value){}方法

                功能:先判断get()是否是能获取到异步线程里面返回的值,如果有就返回true,如果没有就返回false并且将这个值设置为complete(2)里面设置的值

/*5、public boolean complete(T value)方法的使用*/
        CompletableFuture<Integer> async = CompletableFuture.supplyAsync(() -> {
            return 5;
        });
        TimeUnit.SECONDS.sleep(2);
        /*先判断get()是否是能获取到异步线程里面返回的值,如果有就返回true,如果没有就返回false并且将这个值设置为complete(2)里面设置的值*/
        System.out.println(async.complete(2)+" 结果是:"+async.get());

二、对计算结果进行处理

        1、thenApply方法

                功能:对异步线程返回的结果进行进一步的计算,然后返回一个结果;

System.out.println(CompletableFuture.supplyAsync(() -> {
            System.out.println("创建有返回值的线程");
            return 1;
        }).thenApply(a -> {
            return a + 2;
        }).thenApply(a -> {
            return a + 3;
        }).join());

        2、handle方法:

                功能:因为thenApply方法是需要存在依赖关系,所以当前步骤错了,就不会继续往下一步执行,而handle可以,具体看代码;

CompletableFuture.supplyAsync(()->{
            System.out.println("执行第一步");
            Integer i=1/0;
            return 1;
        }).handle((a,e)->{
            System.out.println("执行第二步");
            return a+2;
        }).handle((a,e)->{
            System.out.println("执行第三步");
            return a+3;
        }).whenComplete((c,e)->{
            if (e == null) {
                System.out.println("最后结果:"+c);
            }
        }).exceptionally(e->{
            e.printStackTrace();
            return null;
        });

三、对计算结果进行消费

        1、thenAccept方法

                功能:接收任务的处理结果,并消费处理,无返回结果

CompletableFuture.supplyAsync(()->{
            System.out.println("创建有返回值的线程");
            return 1;
        }).thenAccept(a->{
            System.out.println("最终结果:"+a);
        });

四、对计算速度进行选用

        1、applyToEither

                功能:我们使用线程并不是为了做一道酸菜鱼,一步一步执行,有时候也需要多线程同时进行,比如游戏里面的打麻将,多人pk之类的,就是多个玩家同时进行,谁先结束就给谁标记完成,那么开启多个线程之间的pk怎么玩就看这个方法;

public class ThenApplyDemo {

    private static int i=0;

    public static void main(String[] args) throws InterruptedException {

        /*测试 applyToEither*/
        System.out.println(CompletableFuture.supplyAsync(() -> {
            System.out.println("1号进来了");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("1号结束");
            return 1;
        }).applyToEither(CompletableFuture.supplyAsync(() -> {
            System.out.println("2号进来了");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("2号结束");
            i=5;
            return 2;
        }).applyToEither(CompletableFuture.supplyAsync(() -> {
            System.out.println("线程3进来了");
            try {
                TimeUnit.SECONDS.sleep(4);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 3;
        }), a -> {
            return a;
        }), r -> {
            return r;
        }).join());

        TimeUnit.SECONDS.sleep(5);
        System.out.println(i);

    }

}

五、对计算结果进行合并

        1、thenCombine

                功能:两个CompletionStage任务都完成后,最终能把两个任务的结果一起交给thenCombine来处理,举个例子,大家在调用2个或2个以上的接口时候,总有先后快慢之分,但是最终结果是需要整合2个接口里面的内容,那么这种如何进行呢?

/*测试thenCombine*/
        CompletableFuture.supplyAsync(() -> {
            System.out.println("步骤一执行");
            return 1;
        }).thenCombine(CompletableFuture.supplyAsync(() -> {
            System.out.println("步骤二执行");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("步骤二结束");
            return 2;
        }), (r1, r2) -> {
            System.out.println("执行相加");
            return r1 + r2;
        }).join();

六、总结

        这里给大家分享的都是工作中经常会使用到的一些技术应用点,贴的都是代码,放到编码工具中运行可出结果,码文不易,觉得有帮助的铁子,非常感谢!!l

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

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

相关文章

盘点 JDK 中基于 CAS 实现的原子类

前言 JDK 中提供了一系列的基于 CAS 实现的原子类&#xff0c;CAS 的全称是Compare-And-Swap&#xff0c;底层是lock cmpxchg指令&#xff0c;可以在单核和多核 CPU 下都能够保证比较交换的原子性。所以说&#xff0c;这些原子类都是线程安全的&#xff0c;而且是无锁并发&…

第4季5:图像sensor的驱动源码的编译

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 本文演示如何修改sensor的驱动源码&#xff0c;修改之后如何编译与运行。 一、sensor的注册接口分析 这部分内容见第4季4&#xff1a;图像sensor的驱动源码解析。 二、黑电平 关于黑电平的概念&a…

[附源码]计算机毕业设计抗疫医疗用品销售平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【电巢】电源管理芯片:国产化替代厂家竞逐千亿黄金赛道

前言 整个2022年三季度&#xff0c;全国新能源电动车的起火已高达600多起&#xff0c;同比上升了30%多&#xff0c;如果具体到每天来看&#xff0c;平均每天都有超过7起新能源电动车火灾发生。 7月22日&#xff0c;台湾省专业赛车手林某颖驾驶着一辆白色特斯拉Model X&#xff…

es与mysql之间的数据同步

常见的数据同步方案有三种&#xff1a; 同步调用 异步通知 监听binlog 方案一&#xff1a;同步调用&#xff08;基本不会用&#xff0c;问题太多&#xff09; 基本步骤如下&#xff1a; hotel-demo对外提供接口&#xff0c;用来修改elasticsearch中的数据 酒店管理服务在完成…

活动预告 | DataFunSummit 2022-MLOps 及 AI 工程化落地论坛

11月19日 13&#xff1a;30-17:30&#xff0c;OpenMLDB 项目发起人、第四范式技术副总裁 郑曌作为出品人发起 DataFunSummit 2022 MLOps 及 AI 工程化落地论坛。OpenMLDB PMC、第四范式资深系统架构科师 卢冕&#xff0c;将在论坛中为大家带来议题为《开源机器学习数据库 OpenM…

吃透阿里P8推荐424页Java服务端研发知识图谱后,直接入职蚂蚁P6

前言 蓦然回首自己做开发已经十年了&#xff0c;这十年中我获得了很多&#xff0c;技术能力、培训、出国、大公司的经历&#xff0c;还有很多很好的朋友。但再仔细一想&#xff0c;这十年中我至少浪费了五年时间&#xff0c;这五年可以足够让自己成长为一个优秀的程序员&#…

看场景、重实操,实时数仓不是“纸上谈兵”

本文转载自阿里云Hologres产品负责人合一在ITPUB的访谈&#xff0c;谈谈他眼中的实时数仓&#xff0c; 原文链接&#xff1a; https://mp.weixin.qq.com/s/RZMWf9r4fKV9mNoGGUtaVw 这两年&#xff0c;企业IT领域掀起实时数仓热潮。然而&#xff0c;只要稍做梳理就会发现&#…

【笔试强训】Day 6

&#x1f308;欢迎来到笔试强训专栏 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&#x…

Redis - Redis为什么这么快?

1. Redis为什么这么快&#xff1f; 数据结构简单&#xff0c;对数据操作也简单&#xff0c;Redis 中的数据结构是专门进行设计的&#xff1b;基于内存实现&#xff0c;读写速度快&#xff1b;Redis 是单线程的&#xff0c;避免了不必要的上下文切换和竞争条件&#xff0c;也不…

卖座网站影院界面:优化长列表的滑动流畅度方案

关键点1&#xff1a;优化长列表的滑动流畅度 问题&#xff1a;在长列表中&#xff0c;向下滑动时&#xff0c;为了提高用户的使用感受&#xff0c;这个滑动一般都会做的很流畅。但是在网速不快的情况下&#xff0c;它自然会卡顿&#xff0c;所以为了优化网速慢带来的卡顿现象&…

好用的国产远程控制软件,我只推荐这款!

近年来&#xff0c;越来越多的人需要远程办公&#xff0c;远程为用户提供服务或支持等&#xff0c;导致人们对远程控制软件的需求不断增加。 但现在市面上远程控制软件参差不齐&#xff0c;有的远程控制软件功能不齐全&#xff0c;有的操作步骤过于繁琐&#xff0c;有的使用起…

vue 组件封装——可自由拖拽移动的盒子

最终效果 完整代码 关键性要点&#xff0c;详见注释 组件封装 superBox.vue <template><divref"box_Ref"class"box"mousedown"moveStart"mousemove"moving"mouseup"moveEnd":style"{width: (nodeInfo.width…

js模块化

第1章:模块化入门 1.1.理解什么是模块 将一个复杂的程序依据一定的规则拆分成单个文件&#xff0c;并最终组合在一起这些拆分的文件就是模块&#xff0c;模块内部数据是私有的&#xff0c;只是向外部暴露一些方法与外部其它模块通信 1.2.为什么要模块化? 降低复杂度&#…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java网络游戏虚拟交易平台8rfnp

计算机毕业设计的编程真的不会, 应该怎么办啊, 平时学了3年都没学懂&#xff0c;然而还有一个月就要答辩了&#xff0c;一点东西都没做出来&#xff0c;不知道该怎么办了&#xff1f;好迷茫&#xff0c;如果毕不到业怎么办, 有没有快速的学习方法 毕设毕设&#xff0c;最终的是…

【软件测试】10年测试老鸟,告诉你测试内功修炼之道......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 一名测试人员&#…

Docker[2]-docker的组成与卸载

1.5 Docker的基本组成 1.5.1 镜像(image) Docker 镜像&#xff08;Image&#xff09;就是一个只读的模板。镜像可以用来创建 Docker 容器&#xff0c;一个镜像可以创建很多容器。 docker面向对象容器对象镜像类 1.5.2 容器(container) Docker 利用容器&#xff08;Container&a…

一文读懂如何让网页变灰白色(黑白色)

文章目录1. 文章引言2. 实现方法2.1 修改CSS文件2.2 修改html标签2.3 修改body标签2.4 使用grayscale.js插件1. 文章引言 有段时间&#xff0c;我们打开知名的网页&#xff0c;发现全部变成黑白色了&#xff0c;如下图所示&#xff1a; 一般在清明节&#xff0c;全国哀悼日&am…

学会这些C语言技巧,你的编程能力大大提升

一、函数指针 在讲回调函数之前&#xff0c;我们需要了解函数指针。 我们都知道&#xff0c;C语言的灵魂是指针&#xff0c;我们经常使用整型指针&#xff0c;字符串指针&#xff0c;结构体指针等 int *p1; char *p2; STRUCT *p3; //STRUCT为我们定义的结构体 但是好像我们…

PCB设计总有几个阻抗没法连续的地方。

罗永浩所说“人生总有几次踩到大便的时候”&#xff0c;PCB设计也总有阻抗不能连续的时候。 特性阻抗&#xff1a;又称“特征阻抗”&#xff0c;它不是直流电阻&#xff0c;属于长线传输中的概念。在高频范围内&#xff0c;信号传输过程中&#xff0c;信号沿到达的地方&#xf…