java 多线程之 CompletableFuture 的使用

该代码示例展示了如何使用Java的CompletableFuture进行异步任务执行,比较了顺序查询(stepByStep)和并行查询(allIn)两种方法在查找不同电商平台同一商品价格时的效率差异。程序模拟了从多个店铺获取商品价格的过程,结果显示并行查询能显著减少总耗时。
摘要由CSDN通过智能技术生成
package com.lomonke;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

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

/**
 * @author Lvdoudou
 * @date 2023/5/30 0030 21:54
 * @description CompletableFuture 的真实案例使用
 */
public class CompletableDemo2 {
    /**
     1.需求说明
         1.1同一款产品,同时搜索出同款产品在各大电商平台的售价;
         1.2同一款产品,同时搜索出本产品在同一个电商平台下,各个入驻卖家售价是多少
     2.输出返回:
         出来结果希望是同款产品的在不同地方的价格清单列表,返回一个List<String>
         《mysql》in jd price is 88.05
         《mysql》in dangdang price is 86.11
         《mysql》in taobao price is 90.43
     3. 解决方案,比对同一个商品在各个平台上的价格,要求获得一个清单列表,
         1 step by step,按部就班,查完京东查淘宝,查完淘宝查天猫
         2 all in,万箭齐发,一口气多线程异步任务同时查询。
     * */
    public static List<String> stepByStep(List<BookShop> list, String bookName) {
        return list.stream().map(x -> {
            try { TimeUnit.MILLISECONDS.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e);  }
            return String.format(bookName + "在 %s店里售价为: %.2f", x.getShopName(), x.getPrice(bookName));
        }).collect(Collectors.toList());
    }


    public static List<String> allIn(List<BookShop> list, String bookName) {
        return list.stream().map(x -> {
            return CompletableFuture.supplyAsync(()-> {
                try { TimeUnit.MILLISECONDS.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e);  }
                return String.format(bookName + "在 %s店里售价为: %.2f", x.getShopName(), x.getPrice(bookName));
            });
        }).collect(Collectors.toList()).stream().map(CompletableFuture::join).collect(Collectors.toList());
    }


    public static void main(String[] args) {
        List<BookShop> shopList = new ArrayList<>();
        shopList.add(new BookShop("京东"));
        shopList.add(new BookShop("淘宝"));
        shopList.add(new BookShop("拼多多"));
        shopList.add(new BookShop("拼多多"));
        shopList.add(new BookShop("拼多多"));
        shopList.add(new BookShop("拼多多"));

        long starTime = System.currentTimeMillis();
        List<String> result = stepByStep(shopList, "mysql");
        result.forEach(System.out::println);
        long endTime = System.currentTimeMillis();
        System.out.println("一共花费了"+ (endTime - starTime) + "毫秒");

        long starTime2 = System.currentTimeMillis();
        List<String> result2 = allIn(shopList, "mysql");
        result2.forEach(System.out::println);
        long endTime2 = System.currentTimeMillis();
        System.out.println("一共花费了"+ (endTime2 - starTime2) + "毫秒");

    }

}

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
class BookShop {
    private String shopName;

    public double getPrice(String bookName) {
        return ThreadLocalRandom.current().nextDouble() * 2 + bookName.charAt(0);
    }
}

结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值