• 0
  • 0
分享
  • CompletableFuture实现异步转同步
  • FunTeste 2023-04-01 13:36:20 字数 2100 阅读 632 收藏 0

在很早之前的文章服务端性能优化之异步查询转同步介绍了一种常用到,服务端开发常用到的多个异步查询转同步的方法,本质上就是利用了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<String> future = new CompletableFuture<String>();
        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<String>()
        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包里面的实现类的代码和逻辑。本人实践,获益匪浅。


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 在我们日常测试app或者小程序的时候,经常要遇到抓包的情况,我们常用的抓包工具是fiddler或者charles,这两个工具抓http类型的包还好,但是抓https类型的日志是需要root手机的,现在的真机不是开发者是不好root的,那么这个时候模拟器就可以上场啦。做模拟器的有很多品牌,我最习惯也最常用的是夜神模拟器(雷电模拟器不太好用)首先,模拟器可以设置手机。型号,可以设置性能,屏幕尺寸等基本参数,方便页面展示,这个对于ui方面的测试有一定的帮助,可以看下页面有没有明显的拉伸或者重叠等。也可以在模拟器上面跑关于app的页面自动化这些,也是非常方便调试的,跑不通或者有报错的地方可以直接修改。...
            1 1 11277
            分享
          • 1APP测试基本流程1.1流程图1.2测试周期测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间。1.3测试资源测试任务开始前,检查各项测试资源。--产品功能需求文档;--产品原型图;--产品效果图;--测试设备;--其他。1.4日报及产品上线报告(内部报告机制)测试人员每天需对所测项目发送测试日报。(也就是我这边有邮件通知测试项目的时候一般均属于输出测试日报)。测试日报所包含的内容为:Dell-server\网站软件app等开发\产品测试部\测试知识区域\测试文档类模板\项目测试报告邮件输出模板.doc不同版本测...
            12 12 2627
            分享
          • 当今软件开发中,接口测试已成为必不可少的一环。该如何选择接口测试工具?选择合适的接口测试工具对于程序员来说非常重要,因为这可以帮助他们更快、更高效地评估接口的质量和可靠性。为了提高测试效率和测试质量,自动化接口测试已经逐渐普及。然而,由于市场上有许多不同的接口测试工具,程序员们很难选择合适的工具。如何选择适合自己的工具呢?选择接口测试工具的考虑因素首先,得知道在选择接口测试工具时应该考虑哪些重要因素:一、易用性易用性是选择接口测试工具时首要考虑的因素。工具必须具有清晰的界面,能够让程序员快速、方便地操作。同时,工具也应该具有详细的帮助文档,方便程序员使用。功能性功能性是选择接口测试工具时第二重...
            0 0 881
            分享
          • 放眼全球,了解技术发展的边界和趋势,有助于组织和个人的发展及竞争力的提升,偶尔看到国外某网站的一篇文章,读来颇值得参考。也许这篇文章会给你一份指南,让你快速成长与发展。如今,随着世界数字化,我们目睹了技术进步的巨大变化。也将标志着技术和数字化转型的巨大变化,从而要求组织不断创新和重塑自我。1)敏捷与DevOps很多组织已采用了敏捷与DevOps,用敏捷来响应快速变化的需求,用DevOps来响应对速度的要求。DevOps涉及有助于集成开发和运维的活动(实践,规则,流程和工具),以减少从开发到运维的时间。对于正在寻找缩短软件生命周期,从开发到交付和运维方法的组织,DevOps已成为一种广泛接受的解...
            0 0 1371
            分享
          •   人工智能时代软件的作用越来越大、功能越来越丰富,毫不夸张的讲软件已经悄无声息的融进了生活中的各个角落!对于融入生活的一切事物,人都是格外关心的,软件也不例外。融入生活的一切都是要有品质的,是什么保证了软件的品质呢?怎么保证软件的品质呢?谁来保证软件的品质呢?一切的答案都直接指向一个在当代越来越重要的岗位:软件产品测试。  专业的软件测试人才在当下供需之间存在巨大缺口,软件测试人员的薪水也比较可观,越强的工作能力薪酬越高。怎样成为一个软件测试师呢?如果已经从事软件测试工作,怎样靠本事提高自己的收入呢?有一位软件产品测试行业的有心人贡献出一幅满载知识、方法和经验的思维导图,希望这份贡献能帮你在...
            0 0 1079
            分享
      • 51testing软件测试圈微信