线程池不香了,结构化并发才是王道

2023年 10月 2日 75.5k 0

ExecutorService的不足

当电商APP中需要展示用户信息首页时,服务端接口既要获取用户信息,也要获取用户的订单信息,最后组装数据返回给前端。

针对这个需求,我们可以同时开两个线程,并行执行获取用户信息和获取订单信息两个任务,等到两个任务都执行完并拿到结果后才组装数据返回给前端。

我们先定义获取用户信息任务:

再定义获取订单信息任务:

然后再构造线程池并执行任务:

输出结果为:

看上去一切都刚刚好,但是,如果获取订单信息时出错了,此时会是什么现象呢?修改获取订单任务代码:

此时,获取订单信息任务在执行1秒后会抛出空指针异常,所以获取订单信息任务肯定不会执行成功,关键问题是:获取用户信息任务会不会执行成功呢?它又该不该执行成功呢?

给大家5秒钟思考一下....

我们直接运行代码看结果:

获取订单信息确实抛了异常,但是获取用户信息确实也是执行了,但是此次执行其实在当前业务场景下是没有意义的,因为我们是同时需要用户信息和订单信息来整合数据的,也就是希望获取订单信息和获取用户信息这两个任务中有一个任务执行失败了,另外那个任务就不执行了。

那ExecutorService能不能做到呢?有小伙伴可能想到了ExecutorService中的两个API:

  • invokeAll(Collection
  • 相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论