出自: 腾讯课堂 700多分钟干货实战Java多线程高并发高性能实战全集 , 我学习完了之后, 我给 老师在课上说的话做了个笔记,以及视频的内容,还有代码敲了一遍,然后添加了一些注释,把执
出自:
腾讯课堂 700多分钟干货实战Java多线程高并发高性能实战全集 , 我学习完了之后, 我给 老师在课上说的话做了个笔记,以及视频的内容,还有代码敲了一遍,然后添加了一些注释,把执行结果也整理了一下, 做了个笔记
概述
大型电商公司的支付聚合服务都有这类的场景:
假如步骤1的耗时5秒,步骤2的耗时3秒,步骤3的耗时2秒,如果你是架构师,要求:
比较1和2的性能.
同步调用和异步调用
Future类图
Future的不足
Future直接表述多个Future结果之间的依赖性,有一定的缺陷:
仅等待Future集合中最快结束的任务完成,并返回它的结果
代码
代码地址
https://gitee.com/zjj19941/mutil-thread/tree/master/src/main/java/com/yrxy/thread/case14
Test
public class Test {public static void main(String[] args) {
// 同步调用
long start1 = System.currentTimeMillis();
PaymentService.syncPay();
System.out.println("同步支付耗时:" + (System.currentTimeMillis() - start1)+" ms");
System.out.println("=========================");
// 异步调用
long start2 = System.currentTimeMillis();
PaymentService.asyncPay();
System.out.println("异步支付耗时:" + (System.currentTimeMillis() - start2)+" ms");
}
}
PaymentService
import java.util.concurrent.CompletableFuture;import java.util.concurrent.TimeUnit;
public class PaymentService {
/**
* 异步支付的入口方法
*
* @return
*/
public static boolean asyncPay() {
//校验
CompletableFuture<Boolean> isValid = CompletableFuture.supplyAsync(() -> CheckService.isValid());
//创建订单
CompletableFuture<Integer> orderSum = CompletableFuture.supplyAsync(() -> OrderService.createOrder());
//支付
CompletableFuture<Integer> money = CompletableFuture.supplyAsync(() -> basePay());
// 上面三个都完成之后,再进行下面匿名内部类的代码
CompletableFuture.allOf(isValid, orderSum, money)
.thenRun(() -> System.out.println("完成异步支付"))
.join();
return true;
}
/**
* 同步支付的入口方法
*
* @return
*/
public static boolean syncPay() {
CheckService.isValid();
OrderService.createOrder();
basePay();
System.out.println("同步支付成功");
//假设支付成功
return true;
}
public static int basePay() {
int money = 1000;
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("支付");
//假设支付成功
return money;
}
}
CheckService
import java.util.concurrent.TimeUnit;public class CheckService {
/**
* 返回true说明订单流程才会往下走
*/
public static boolean isValid() {
System.out.println("订单生成前,检验订单是否合法" );
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
//假设订单合法,通过校验
return true;
}
}
OrderService
import java.util.concurrent.TimeUnit;public class OrderService {
public static int createOrder() {
int orderSum=1;
System.out.println("生成订单" );
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
//假设订单数量为1
return orderSum;
}
}