今天小编给大家分享一下Java多线程异步调用性能怎么调优的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
大型电商公司的支付聚合服务都有这类的场景:
调用校验服务校验待生成的订单是否合法
订单服务生成订单(校验服务和订单服务没有依赖关系)
调用1和2,支付服务实现支付核心的功能
结合步骤1至3完成支付服务的聚合调用
假如步骤1的耗时5秒,步骤2的耗时3秒,步骤3的耗时2秒,如果你是架构师,要求:
1.请实现微服务的同步调用
2.请实现微服务的异步调用(使用CompletableFuture实现)
比较1和2的性能.
Future直接表述多个Future结果之间的依赖性,有一定的缺陷:
1.将两个异步计算合并为一个(第二个异步计算依赖于第一个的结果),这个用Future不太好实现.
2.等待Future集合中的所有的任务都完成
仅等待Future集合中最快结束的任务完成,并返回它的结果
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");
}
}
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;
}
}
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;
}
}
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;
}
}
以上就是“Java多线程异步调用性能怎么调优”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。