package com.zhjstu.juc_demo;
import lombok.Getter;
import org.springframework.util.StopWatch;
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;
/**
* 异步比价案例
*/
public class demo04 {
static List<NetMall> netMalls = Arrays.asList(
new NetMall("JD"),
new NetMall("PDD"),
new NetMall("TB")
);
public static List<String> getPriceByNetMall1(List<NetMall> netMalls,String produceName){
return netMalls.stream().map( netMall -> {
return String.format("%s price is %.2f",netMall.getName(),netMall.getPriceByNetMallName(produceName));
} ).collect(Collectors.toList());
}
public static List<String> getPriceByNetMall2(List<NetMall> netMalls,String produceName){
List<CompletableFuture<String>> collect = netMalls.stream().map(netMall -> {
return CompletableFuture.supplyAsync(() -> {
return String.format("%s price is %.2f", netMall.getName(), netMall.getPriceByNetMallName(produceName));
});
}).collect(Collectors.toList());
return collect.stream().map(CompletableFuture::join).collect(Collectors.toList());
}
public static void main(String[] args) {
Runnable runnable = () -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
StopWatch stopWatch = new StopWatch("step by step");
stopWatch.start();
List<String> priceByNetMall1 = getPriceByNetMall1(netMalls,"mysql");
priceByNetMall1.forEach(System.out::println);
stopWatch.stop();
System.out.println(stopWatch.prettyPrint());
};
Thread thread = new Thread(runnable);
thread.start();
System.out.println("==========================================================");
Thread thread1 = new Thread(() -> {
StopWatch stopWatch1 = new StopWatch("async");
stopWatch1.start();
List<String> priceByNetMall2 = getPriceByNetMall2(netMalls, "mysql");
priceByNetMall2.forEach(System.out::println);
stopWatch1.stop();
System.out.println(stopWatch1.prettyPrint());
});
thread1.start();
}
}
class NetMall {
@Getter
private String name;
public NetMall(String name) {
this.name = name;
}
public Double getPriceByNetMallName(String productName){
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return ThreadLocalRandom.current().nextDouble() * 2 + productName.charAt(0);
}
}
异步比价案例
最新推荐文章于 2024-09-27 00:45:01 发布
该代码示例展示了如何使用Java的CompletableFuture进行异步处理来提高价格比对的效率。通过将任务分解为多个并行执行的任务,然后合并结果,与传统的同步方法相比,异步方法可以显著减少总耗时。代码中使用了Spring的StopWatch进行性能测试,比较了同步和异步方法的执行时间。
摘要由CSDN通过智能技术生成