Java并发编程—CompletableFuture的异步执行案例

news2024/12/23 18:33:53

        在博主前几篇博客中,https://blog.csdn.net/qq_52545155/article/details/128167519?spm=1001.2014.3001.5501,给大家分享了关于多线程中异步任务的执行和一些相关概念,在这篇博客中,主要是通过一个实际的案例让大家对于CompletableFuture的用法有一个深入的理解

🍏一、需求分析

        临近过年了,很多铁子都有购物的需求,那么大家肯定想花更少的钱去买相同的一个产品,例如茅台酒在不同的购物平台或者不同的商家里面价格是不一样的,例如:

🍕jd:

🍕tb:

       图中这些价格都是不一样的,所以大家就会有一个需求,能不能把这个当作一个程序进行一个数据统计,统计出不同平台的茅台价格,然后自己根据价格、商家来购买,这个例子大家都明白,其实在工作中也有很多这种的需求,那么针对这种需要统计的需求业务我们该怎么去做呢?

🍏二、方案设计

        相信很多铁子有心里有方案:

        🍄1、一个一个的进行记录,或者用爬虫去爬

        🍄2、用异步多线程进行统计,这这里博主会分享第二种的实践方式

🍏三、代码展示

        前面是举个例子,这个并不会去搜刮数据哈,大家对于接口api的调用可以自行补充,主要分享思维,商城在代码种是以对象实体存在的;    

🍄1、先准备一个商城公共类

class ShoppMall{
    private String mallName;

    public String getMallName() {
        return mallName;
    }

    public ShoppMall(String mallName) {
        this.mallName = mallName;
    }

    /*商城存在了,这里提供一个根据输入的商品名返回一个价格的方法*/
    public Double getPrice(String commodityName){
        //模拟检索用时1s
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    	//高并发多线程使用ThreadLocalRandom
        return ThreadLocalRandom.current().nextDouble()*2+commodityName.charAt(0);
    }

}

🍄2、业务开始前还需要实例化几个具体的商城对象出来,这样才能通过上面的getPrice()方法获取到价格

public class CSDNCompletableFutureDemo {

    //实例化几个商城对象,放到集合中
    private static List<ShoppMall> list= Arrays.asList(new ShoppMall("jd"),
            new ShoppMall("tb"),
            new ShoppMall("pdd")
            );




}

🍄3、一个商城一个商城进行搜索的操作,代码如下:

 /*一个一个的从商城进行搜索一个商品,然后返回一个格式化好了的集合*/
    public static List<String> stepSearch(List<ShoppMall> list,String comName){
        return list.stream().map(mall -> {
            System.out.println(mall.getMallName() + "正在查找" + comName);
            return String.format("%s 的 %s 价格是%.2f", mall.getMallName(), comName, mall.getPrice(comName));
        }).collect(Collectors.toList());
    }

🍄4、这个时候我们可以先对其进行一个测试,看看效果如何:

public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        List<String> search1 = stepSearch(list, "茅台");
        for (String s : search1) {
            System.out.println(s);
        }
        System.out.println("本次用时"+(System.currentTimeMillis()-startTime)+"毫秒");

    }

效果如下:

🚗总结:这里每一个商城搜索都用了1s,然后加上其他的耗时,一共是3061毫秒,代码着我有多少个平台,至少就要花n+秒的时间,显然这个很不能让人接收,那么在我们用Compleatable如何去实现呢,接着往下看;

🍄5、用异步多线程进行执行,代码如下:

/*用CompletableFuture异步多线程进行搜索,然后返回一个格式化好了的集合*/
    public static List<String> synSearch(List<ShoppMall> list, String comName) {
        return list.stream().map(mall -> {
            System.out.println(mall.getMallName() + "正在查找" + comName);
            return CompletableFuture.supplyAsync(() -> {
                return String.format("%s 的 %s 价格是%.2f", mall.getMallName(), comName, mall.getPrice(comName));
            });
        }).collect(Collectors.toList()).stream().map(CompletableFuture::join).collect(Collectors.toList());
    }

运行代码:

    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
//        List<String> search1 = stepSearch(list, "茅台");
        List<String> search1 = synSearch(list, "茅台");
        for (String s : search1) {
            System.out.println(s);
        }
        System.out.println("本次用时" + (System.currentTimeMillis() - startTime) + "毫秒");

    }

效果图:

 

🚗总结:每个商城检索要一秒,而这种方式相当于是在一秒钟,多个商城同时进行搜索,然后将结果进行了返回,达到了万箭齐发的效果,这也正是我们想要的。

🍏四、总结

        🍄1、博主分别用了2种方式,传统方式的one by one一个一个的搜索是非常耗时且效率低下

        🍄2、采用多线程同时进行搜索,节约时间节约成本,是我们想要的效果

        🍄3、实现功能是每个程序员都要完成的,但是最终都是靠性能说服别人,这里是3个商城,普通的就要3s+,而异步执行只需要一秒即可完成,假如我多实例化一个商城,普通方式就需要多一秒,而异步还是只要一秒,显然比one by one来得更有力,这就是为啥高并发这么使人神往;

        🍄4、当商城实例足够多了的话,可以不选择用CompletableFuture自带的线程池,可以自定义线程池然后进行传入使用。还可以分批次进行线程执行,都是一些优化手段;

         🍄4、代码很多是Stream流和Lambda表达式,需要大家把代码运行看一下效果就可以理解

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

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

相关文章

利用卷神经网络实现IOSLab数字手写图像识别

利用卷神经网络实现IOSLab数字手写图像识别 文章目录利用卷神经网络实现IOSLab数字手写图像识别一、前言二、作业要求三、数据集样本分析四、代码实现1、运行环境2、导入依赖项3、导入数据集4、加载数据和数据预处理5、划分数据集6、CNN网络结构构建7、编译模型8、训练模型9、模…

性能分析之解析 RESAR 性能分析七步法

文章目录一、压力场景数据分析二、架构分析三、响应时间分析四、全局监控分析五、定向监控六、判断性能瓶颈七、提出解决方案一、压力场景数据分析 下面是⼀个登录接⼝的基准场景测试&#xff0c;JMeter 启动后&#xff0c;线程在 1-2 个的时候 TPS 已经达到 200 左右&#xf…

JavaScript -- 字符串常用方法及示例代码介绍

文章目录字符串的方法1 length2 索引3 str.at()4 str.charAt()5 str.concat()6 str.includes()7 str.indexOf() 和 str.lastIndexOf()8 str.startsWith() 和 str.endsWith()9 str.padStart() 和 str.padEnd()10 str.replace() 和 str.replaceAll()11 str.slice() 和 str.substr…

Mysql调优(一)——性能监控

一、大纲图 【Mysql调优.xmind】 二、Mysql调优简写 2.1 性能监控 2.1.1 使用show profile查询剖析工具&#xff0c;可以指定具体的type 此工具默认是禁用的&#xff0c;可以通过服务器变量在会话级别动态的修改&#xff1a; set profiling1;当设置完成之后&#xff0c;在…

某Android大厂面试100题,涵盖测试技术、环境搭建、人力资源......【速度领取】

最近看到网上流传着各种面试经验及面试题&#xff0c;往往都是一大堆技术题目贴上去&#xff0c;但是没有答案。 为此&#xff0c;小编用业余时间整理了这份软测常见的面试题及详细答案&#xff0c;包含测试技术面试题、开发及环境搭建类面试题以及人力资源方向的面试题&#…

代码随想录训练营第42天|01背包问题、LeetCode 416. 分割等和子集

参考 代码随想录 01背包问题 01背包是在M件物品取出若干件放在空间为W的背包里&#xff0c;每件物品的体积为W1&#xff0c;W2至Wn&#xff0c;与之相对应的价值为P1,P2至Pn。01背包是背包问题中最简单的问题。01背包的约束条件是给定几种物品&#xff0c;每种物品有且只有一…

java计算机毕业设计ssm网上拍卖系统vdum4(附源码、数据库)

java计算机毕业设计ssm网上拍卖系统vdum4&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

MySql分库分表

问题分析&#xff1a; 随着互联网及移动互联网的发展&#xff0c;应用系统的数据量也是成指数式增长&#xff0c;若采用单数据库进行数据存储&#xff0c;存在以下性能瓶颈&#xff1a; 1、IO瓶颈&#xff1a;热点数据太多&#xff0c;数据库缓存不足&#xff0c;产生大量磁盘…

小快轻准,5分钟自助上线,中小型制造企业数字化转型

中小企业作为国民经济的重要组成部分&#xff0c;占据我国企业数量的90%以上。 继《中小企业数字化赋能专项行动方案》发布后&#xff0c;工信部近日印发《中小企业数字化转型指南》&#xff0c;提出14条具体举措&#xff0c;为中小企业明确数字化转型路径。 地方政府也纷纷出…

Linux系统管理、运行级别、关闭防火墙

目录 一、Linux服务管理 1.1 基本概念 1.2 systemctl&#xff08;centos7&#xff0c;很重要&#xff09; 1.2.1 基本语法 1.2.2 查看服务 1.2.3 防火墙操作 1.3 systemctl 设置后台服务的自启配置 二、系统运行级别 2.1 运行级别 2.2 查看当前运行级别 2.2修改当前运行…

8年三届世界杯,8年前端开发,梅西一共踢没了我八千八

转眼2022年即将过去&#xff0c;我已经做了那么久的开发了&#xff0c;一路走来&#xff0c;不断的工作&#xff0c;换工作&#xff0c;找工作&#xff0c;不断的学习新知识。 同时也看着梅西参加了3届世界杯了&#xff0c;逝者如斯夫&#xff0c;不舍昼夜啊。 在这8年里&#…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java焦作旅游网站q5msq

首先选择计算机题目的时候先看定什么主题&#xff0c;一般的话都选择当年最热门的话题进行组题&#xff0c;就比如说&#xff0c;今年的热门话题有奥运会&#xff0c;全运会&#xff0c;残运会&#xff0c;或者疫情相关的&#xff0c;这些都是热门话题&#xff0c;所以你就可以…

Elasticsearch Data Stream 数据流使用

本文是《Elasticsearch索引生命周期管理ILM》中数据流索引补充篇&#xff0c;文章地址如下&#xff1a; https://mp.weixin.qq.com/s/ajhFp-xBU1dJm8a1dDdRQQ 并且在另一片Elasticsearch的进阶使用-动态模版中也提到了相关数据流索引的内容&#xff0c;有兴趣的可以回过头看一下…

知乎热议的 Java 面试成神笔记,下载量已过90k,面试神技.exe进程已启动

在某论坛上面对于“中国程序员数量是否已经饱和或者过剩”这个话题很火&#xff01; 今年大家都有一个共同的感受&#xff1a;工作不好找&#xff0c;薪资不理想&#xff0c;面试造火箭。 其实&#xff0c;由于不仅是因为今年受疫情影响&#xff0c;很多公司经营不下去&#xf…

Java中的类和对象(Java系列4)

目录 前言&#xff1a; 1.什么是面向对象 2.类的定义和使用 3.this引用 3.1this引用的概念 3.2this引用的特性 3.3this的使用 4.构造方法 4.1构造方法概念 4.2构造方法的特性 5.默认初始化 6.就地初始化 7.封装 8.封装扩展之包 8.1为什么对提出包的概念呢&#x…

前端开发需要会什么?先掌握这三大核心关键技术

前端工程师&#xff0c;如何创造/制作一个网站应用呢&#xff1f; 为了更好的让你理解&#xff0c;我们简单地做一个类比&#xff1a;动画制作者在创造人物的时候&#xff0c;需要从构图、着色和动画效果上入手&#xff0c;让人物有骨、有血&#xff0c;灵性生动。 而如果将一…

长安链共识模块优化中的“精益求精”

长安链在v2.3.0版本中对共识模块进行了优化&#xff0c;主要包括优化TBFT消息机制并将异步发送信息功能进行了拆分&#xff0c;独立设计了一致性引擎模块。优化后共识模块整体逻辑更清晰、共识更高效。 TBFT消息机制优化背景 在长安链的V2.3.0版本的TBFT共识算法中&#xff0…

W易NEWS login逆向分析

内容仅供参考学习 欢迎朋友们V一起交流&#xff1a; zcxl7_7 目标 网址&#xff1a;案例地址 分析 首先进行一次登录&#xff0c;获取流程 在这个流程中可以看到dl/zj/mail/l这个接口返回了新的cookie&#xff0c;可以猜测这个是登录核心&#xff1b;dl/zj/mail…

通达信接口公式怎样进行破解?

如果我们想对通达信接口的公式进行破解该怎么做呢&#xff1f;今天我们来风险一下方法&#xff0c;但是有两个前提&#xff1a; 1:不是使用winhex&#xff0c;而是使用ollydbg来破解&#xff1b; 2:只是用户公式修改密码有效。对于导入密码无效。对于系统公式密码无效&#xff…

c语言:关键字(一)

关键字一.古老的关键字—auto1.全局变量与局部变量2.auto的使用二.最快的关键字—register一.古老的关键字—auto 1.全局变量与局部变量 在花括号里定义的变量就是局部变量&#xff0c;反之就是全局变量 这里举个例子 这时我们在进行编译时会报错告诉我们y没定义 这其实就是…