首页 > 编程语言 >JUC并发编程 CompletableFuture 业务代码实战

JUC并发编程 CompletableFuture 业务代码实战

时间:2024-01-14 14:55:28浏览次数:48  
标签:JUC String list 编程 List productName CompletableFuture import

1 需求

电商网站比价需求分析:

1.1 需求说明:

a. 同一款产品,同时搜索出同款产品在各大电商平台的售价
b. 同一款产品,同时搜索出本产品在同一个电商平台下,各个入驻卖家售价是多少

1.2 输出返回:

a. 出来结果希望是同款产品的在不同地方的价格清单列表,返回一个List
例如:《Mysql》 in jd price is 88.05 《Mysql》 in taobao price is 90.43

1.3 解决方案,对比同一个产品在各个平台上的价格,要求获得一个清单列表

a. step by step,按部就班,查完淘宝查京东,查完京东查天猫....
b. all in,万箭齐发,一口气多线程异步任务同时查询》

2 代码

2.1 NetMall类

public class NetMall{
 
    @Getter
    private String netMallName;
    
    
    public NetMall(String netMallName){
        this.netMallName = netMallName ;
    }
    
    public double calcPrice(String productName){
        
        try{TimeUnit.SECONDS.sleep(1);}catch (Exception e){e.printStackTrace();};
        
        return ThreadLocalRandom.current().nextDouble() * 2 + productName.charAt(0);
    }
    
}

2.2 CompletableFutureMallDemo 类

package com.kwfruit.thread.step01;

import lombok.Getter;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

/**
 *  案例说明:电商比价需求,模拟如下情况:
 *  1需求:
 *   1.1 同一款产品,同时搜索出同款产品在各大电商平台的售价
 *   1.2 同一款产品,同时搜索出本产品在同一个电商平台下,各个入驻卖家售价是多少
 *
 *  2输出:出来结果希望是同款产品的在不同地方的价格清单列表,返回一个List<String>
 *   《mysql》 in jd price is 88.04
 *   《mysql》 in taobao price is 88.03
 *   《mysql》 in dangdang price is 88.03
 *
 *
 *
 */
public class CompletableFutureMallDemo {
    
    static List<NetMall> list = Arrays.asList(
            new NetMall("jd"),
            new NetMall("taobao"),
            new NetMall("dangdang"));
    
    
    /**
     * 传统方法 一步一步循环算
     */
    public static List<String> getPrice(List<NetMall> list,String productName){
        
        return list.stream()
                .map(netMall -> String.format(productName + "in %s price is %.2f", netMall.getNetMallName(),
                        netMall.calcPrice(productName))).collect(Collectors.toList());
    }

    /**
     * 用CompletableFuture 异步进行计算
     * @param list
     * @param productName
     * @return
     */
    public static List<String> getPriceByCompletableFuture(List<NetMall> list,String productName){
        
        return list.stream()
                .map(netMall -> CompletableFuture.supplyAsync(()->String.format(productName + "in %s price is %.2f", netMall.getNetMallName(),
                        netMall.calcPrice(productName))))
                .collect(Collectors.toList()).stream()
                .map(s->s.join())
                .collect(Collectors.toList());
    }
    
    
    
    
 
    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        List<String> mysqlList = getPrice(list, "mysql");
//        List<String> mysqlList = getPriceByCompletableFuture(list, "mysql");
        for (String element: mysqlList){
            System.out.println(element);
        }
        long endTime = System.currentTimeMillis();
        System.out.println("---costTime:"+(endTime - startTime) + "毫秒");
    }
    
}

3 性能测试

3.1 step by step 一步一步算 计算时长

3089毫秒

3.2 万箭齐发 用CompletableFuture异步计算 计算时长

1094毫秒 !!!

4 总结

从上面看出CompletableFuture可以极大的提高我们的运算效率,因此在一些业务代码中我们可以合理的运用CompletableFuture来优化我们的程序。

标签:JUC,String,list,编程,List,productName,CompletableFuture,import
From: https://www.cnblogs.com/mangoubiubiu/p/17963734

相关文章

  • JUC并发编程 用CompletableFuture 创建异步任务
    1CompletableFuture对Future的改进1.1CompletableFuture为什么会出现get()方法在Future计算完成之前会一直处在阻塞状态下,阻塞的方式和异步编程的设计理念相违背。isDene()方法容易耗费cpu资源(cpu空转),对于真正的异步处理我们希望是可以通过传入回调函数,在Future结束时自动......
  • JUC 异步编程利器 CompletableFuture 介绍
    1从FutureTask到CompletableFuture1.1FutureFuture接口(FutureTask实现类)定义了操作异步任务执行一些方法,如获取异步任务的执行结果、取消异步任务的执行、判断任务是否被取消、判断任务执行是否完毕等。举例:比如主线程让一个子线程去执行任务,子线程可能比较耗时,启动子线程开......
  • Java多线程编程实战指南(设计模式篇)PDF
    随着CPU多核时代的到来,多线程编程在充分利用计算资源、提高软件服务质量方面扮演了越来越重要的角色。而解决多线程编程中频繁出现的普遍问题可以借鉴设计模式所提供的现成解决方案。然而,多线程编程相关的设计模式书籍多采用C++作为描述语言,且书中所举的例子多与应用开发人员的......
  • Java多线程编程实战指南(核心篇)PDF
    随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(MulticoreProcessor)离我们越来越近了——如今就连智能手机这样的消费类设备都已配备了4核乃至8核的处理器,更何况商用系统!在此背景下,以往靠单个处理器自身处理能力的提升......
  • Java多线程编程实战指南(核心篇)PDF
    随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(MulticoreProcessor)离我们越来越近了——如今就连智能手机这样的消费类设备都已配备了4核乃至8核的处理器,更何况商用系统!在此背景下,以往靠单个处理器自身处理能力的提升所......
  • Scala编程语言day1
    一、Scala概述Scala是一种运行在JVM上的函数式的面向对象语言,它集成了面向对象编程和面向函数式编程的各种特性,以及更高层的并发模型Scala的语言特点Scala是兼容的:兼容Java,可以访问庞大的Java类库Scala是精简的:Scala表达能力强,开发速度快Scala是高级的:Scala可以让你的程序保......
  • 【教3妹学编程-算法题】构造限制重复的字符串
    3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包”2哥:3妹,什么事呀这么开森。3妹:2哥你看今天的天气多好啊,最近一周都是大晴天,艳阳高照2哥:是啊,天气不冷不热的,很适合生活3妹:据说南方的小土豆都跑到北方滑雪了,哈哈哈哈2哥:泼水成冰好玩是好玩,但是一定要注意防寒哦,看新闻都有......
  • 《Java编程思想第四版》学习笔记54--关于UncaughtExceptionHandler
    Java中在处理异常的时候,通常的做法是使用try-catch-finally来包含代码块,但是Java自身还有一种方式可以处理——使用UncaughtExceptionHandler。它能检测出某个线程由于未捕获的异常而终结的情况。当一个线程由于未捕获异常而退出时,JVM会把这个事件报告给应用程序提供的UncaughtExce......
  • 学了这么多编程语言,你学会了几种“Hello world”呢?
    学了这么多编程语言,你学会了几种“Helloworld”呢?王菜鸟于2020-05-0921:53:48发布阅读量2.1k收藏2点赞数15分类专栏:随笔记录文章标签:编程语言版权随笔记录专栏收录该内容31篇文章2订阅订阅专栏你知道多少种编程语言?本文整理了30种编程语言的HelloWorld程序,有些......
  • socket编程 [补档-2023-07-10]
    Linux网络编程1.socket编程socket是一种通信机制,用于在网络中不同计算机之间进行数据传输,当然也可用用于进程间通信。在linux中,有文件描述符这么个东西,我们可以通过socket函数创建一个网络连接,socket的返回值为一个文件描述符,我们拿到这个文件描述符就可以像操作普通io文件那样......