• 【Java面试】说一下你对CompletableFuture的理解


    Hi,大家好,我是Mic,一个工作了14年的程序员和创业者。

    一个工作了4年的粉丝,很兴奋的和我说,他拿到了字节跳动的offer

    评级是2-1 ,相当于阿里的p6。

    他说多亏了面试之前每天刷我的面试短视频。

    这种正向反馈,让我觉得做这个事情很有价值。

    好的,今天给大家分享一道并发编程的面试题。

    “请你说一下你对CompletableFuture的理解”。

    下面看看普通人和高手对这个问题的回答。

    需要高手面试文档(附赠大厂内部十万字面试文档)或者有不懂的技术面试题想咨询的小伙伴可以后台私信【Mic】或者评论区留言。

    普通人:

    CompletableFuture它好像是(JDK)1.8里面的一个工具吧。

    因为我们以前去做那种异步的具有回调的一些任务的时候,我们可以用那个Future和Completable,但是如果我要去通过异步的那个触发那个返回值那个异步任务去执行我的那个代码的时候就是我最终要去获取结果的时候我需要通过future.get去阻塞获取。

    但这种方式就会对我的整个程序会有一些阻塞和影响,但是好像CompletableFuture它是可以触发一个这种回调,所以它在这个跟future相比就我觉得还是它比较方便一点。

    高手:

    好的,面试官。

    CompletableFuture是JDK1.8里面引入的一个基于事件驱动的异步回调类。

    简单来说,就是当使用异步线程去执行一个任务的时候,我们希望在任务结束以后触发一个后续的动作。

    而CompletableFuture就可以实现这个功能。

    举个简单的例子,比如在一个批量支付的业务逻辑里面,

    涉及到查询订单、支付、发送邮件通知这三个逻辑。

    这三个逻辑是按照顺序同步去实现的,也就是先查询到订单以后,再针对这个订单发起支付,支付成功以后再发送邮件通知。

    而这种设计方式导致这个方法的执行性能比较慢。

    所以,这里可以直接使用CompletableFuture,(如图),也就是说把查询订单的逻辑放在一个异步线程池里面去处理。

    然后基于CompletableFuture的事件回调机制的特性,可以配置查询订单结束后自动触发支付,支付结束后自动触发邮件通知。

    从而极大的提升这个这个业务场景的处理性能!

    CompletableFuture提供了5种不同的方式,把多个异步任务组成一个具有先后关系的处理链,然后基于事件驱动任务链的执行。

    • 第一种,thenCombine,把两个任务组合在一起,当两个任务都执行结束以后触发事件回调。

    • 第二种,thenCompose,把两个任务组合在一起,这两个任务串行执行,

      也就是第一个任务执行完以后自动触发执行第二个任务。

    • 第三种,thenAccept,第一个任务执行结束后触发第二个任务,

      并且第一个任务的执行结果作为第二个任务的参数,这个方法是纯粹接受上一个任务的结果,不返回新的计算值。

    • 第四种,thenApply,和thenAccept一样,但是它有返回值。

    • 第五种,thenRun,就是第一个任务执行完成后触发执行一个实现了Runnable接口的任务。

    最后,我认为,CompletableFuture弥补了原本Future的不足,使得程序可以在非阻塞的状态下完成异步的回调机制。

    以上就是我对这个问题的理解。

    总结

    CompletableFuture的使用场景还挺多的,特别是在一些RPC通信框架底层。

    所以作为一个能够提升程序性能的异步化组件,大家还是非常有必要去了解它的。

    大家记得点赞收藏加关注。

    需要高手面试文档(附赠大厂内部十万字面试文档)或者有不懂的技术面试题想咨询的小伙伴可以扫描下方二维码

    ↓↓↓↓↓↓↓↓↓↓↓↓↓↓

  • 相关阅读:
    通过「内网穿透」技术,实现出差期间远程访问企业局域网中的象过河ERP系统
    Docker背后的标准化容器执行引擎——runC
    Unity Hair 毛发系统 初体验
    OpenCV官方教程中文版 —— 图像的基础操作
    论文笔记: 度量学习基本理解
    Pandas数据预处理python 数据分析之4——pandas 预处理在线闯关_头歌实践教学平台
    重点用能单位能耗系统在湖南三立集团的应用
    HTML 实时显示本地电脑时间(精确到毫秒)
    《论文笔记》Multi-UAV Collaborative Monocular SLAM
    基于SSM的个人博客系统设计与实现(Java+MySQL)
  • 原文地址:https://blog.csdn.net/q331464542/article/details/125487318