扫码阅读
手机扫码阅读
CompletableFuture实现异步转同步
75 2024-04-13
在很早之前的文章
服务端性能优化之异步查询转同步介绍了一种常用到,服务端开发常用到的多个异步查询转同步的方法,本质上就是利用了java.util.concurrent.CountDownLatch
的功能特性,将几个异步查询任务都设置一个java.util.concurrent.CountDownLatch
实例,然后等待所有异步任务完成再组装响应,同步返回给客户端。
最近通过对java.util.concurrent
包的继续学习,又掌握了java.util.concurrent.CompletableFuture
这个类的基本使用,使用场景一个请求过来之后,需要等待另外一个异步任务完成之后,获取响应结果。特别适合WebSocket场景,比如A向B发送了一条消息,需要等待B把消息发过来这种场景。
下面我用一个简单的例子来演示一下java.util.concurrent.CompletableFuture
如何使用,先分享一个Java版本:
import com.funtester.frame.SourceCode; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class PerFunTest extends SourceCode { private static final Logger log = LogManager.getLogger(PerFunTest.class); public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
log.info("测试开始");
CompletableFuture future = new CompletableFuture(); new Thread(() -> {
sleep(1.0);
future.complete("FunTester");
log.info("赋值结束");
}).start();
String get = future.get(5, TimeUnit.SECONDS); if (get != null) log.info("取值: {}", get);
}
}
控制台输出:
20:38:47.648 main 测试开始
20:38:48.654 main 取值: FunTester
20:38:48.654 Thread-1 赋值结束
这里我们可以看到47秒测试开始,然后是48秒赋值结束和取值几乎同时完成。如果我们在thread中的sleep时间超过了get超时时间,就会报错。这里可以避免某个异步消息来得太晚导致接口响应时间过长。
下面我展示一下Groovy的实践,可以对比体验一下:
import com.funtester.frame.SourceCode import groovy.util.logging.Log4j2 import java.util.concurrent.CompletableFuture import java.util.concurrent.TimeUnit @Log4j2 class Ts extends SourceCode { static void main(String[] args) {
log.info("测试开始") def future = new CompletableFuture()
fun {
sleep(1.0)
future.complete("FunTester")
log.info("赋值结束")
} def get = future.get(5, TimeUnit.SECONDS) if (get != null) log.info("取值: $get")
}
}
对于异步转同步的场景实践,就分享到这里。对于对Java多线程编程有兴趣的小伙伴,可以多看java.util.concurrent
包里面的实现类的代码和逻辑。本人实践,获益匪浅。
原文链接:
http://mp.weixin.qq.com/s?__biz=MzU4MTE2NDEyMQ==&mid=2247498802&idx=1&sn=1388cf5727f4b6603d9fc01143b7e14e&chksm=fd497104ca3ef8123d16d6081502cb877363540ce82b9f0c2debb5c073c7cc267b1ddf4cbfbf#rd
FunTester的其他文章
基于代码的自动化和无代码自动化
在之前的文章AI如何影响测试行业中提到了随着更先进的技术进入由AI/ML支持的连续测试领域,组织尤其是测试从业人员常常正在争论哪种更好,是通过编程语言完成自动化测试还要采用无代码测试解决方案呢?
Groovy closure 与Java function转换
我在项目里面都是 Java 和 Groovy 混这写,之前逻辑是??
如何设置质量检查流程
根据《2019-2020年世界质量报告》,只有「23%」 的IT预算分配给质量检查。自2015年占比「35%」 以来一直呈下降趋势。
Selenium异常集锦
当测试工程师执行Selenium测试自动化用例时,可能会遇到很多陌生的Exception。
软件测试的内容
简介软件测试是一个快速发展的职业领域,随着信息技术的不断发展和应用,软件测试的重要性也越来越受到重视。
加入社区微信群
与行业大咖零距离交流学习
软件研发质量管理体系建设
白皮书上线