ExecutorService的不足
当电商APP中需要展示用户信息首页时,服务端接口既要获取用户信息,也要获取用户的订单信息,最后组装数据返回给前端。
针对这个需求,我们可以同时开两个线程,并行执行获取用户信息和获取订单信息两个任务,等到两个任务都执行完并拿到结果后才组装数据返回给前端。
我们先定义获取用户信息任务:
再定义获取订单信息任务:
然后再构造线程池并执行任务:
输出结果为:
看上去一切都刚刚好,但是,如果获取订单信息时出错了,此时会是什么现象呢?修改获取订单任务代码:
此时,获取订单信息任务在执行1秒后会抛出空指针异常,所以获取订单信息任务肯定不会执行成功,关键问题是:获取用户信息任务会不会执行成功呢?它又该不该执行成功呢?
给大家5秒钟思考一下....
我们直接运行代码看结果:
获取订单信息确实抛了异常,但是获取用户信息确实也是执行了,但是此次执行其实在当前业务场景下是没有意义的,因为我们是同时需要用户信息和订单信息来整合数据的,也就是希望获取订单信息和获取用户信息这两个任务中有一个任务执行失败了,另外那个任务就不执行了。
那ExecutorService能不能做到呢?有小伙伴可能想到了ExecutorService中的两个API: