java future专题 2-6 CompletableFuture源码探秘-异常处理(1)

1.问题引出

CompletableFuture是异步编程的很好工具,那么对于异步编程,最令人担心的现象就是异常被吞掉了。对应的,同步场景,因为天然是同步等结果,无非就是这么几种情况,返回正常结果,抛出异常,等待超时(设置了超时时间),一直等待(没有设置超时时间),但是对于异步场景来说,无论是监听还是会掉,都有可能因为使用方式的错误导致没有会掉或者没有触发监听,造成的结果就是这次的请求的结果凭空丢失了。

举个最简单的例子:

这是一个CompletableFuture最普通的使用方式,异步执行一个任务,如图所示是一个http请求,拿到结果之后执行complete方法,会触发该future的thenRun方法。但是如果这个http请求抛出了异常会怎么样呢?因为没有catch异常并对异常进行相应的处理,所以这个future永远也不会执行,相当于这个http的结果丢了,回调也不会触发了。

那么正确的做法是什么呢?

这样的话在http请求抛出异常的时候,通过completeExceptionally方法触发了future的回调。这就是一个简单的对于异常的处理,防止异常导致无回调的现象发生。但是本篇文章并不是这么简单的就结束了,而是刚刚开始。因为CompletableFuture提供了很强大的功能,封装了很多方法,这些方法如果使用不当,即使你考虑了异常,可能也不会按照你设想的方式去执行,比如:

这里用thenRun替换掉了上面的whenComplete,那

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值