• CompletableFuture的理解


    CompletableFuture 是 JDK1.8 里面引入的一个基于事件驱动的异步回调类。简单来说,就是当使用异步线程去执行一个任务的时候,我们希望在任务结束以后触发一个后续的动作。而 CompletableFuture 就可以实现这个功能。

    业务问题

    举个简单的例子,比如在一个批量支付的业务逻辑里面,涉及到查询订单、支付、发送邮件通知这三个逻辑。这三个逻辑是按照顺序同步去实现的,也就是先查询到订单以后,再针对这个订单发起支付,支付成功以后再发送邮件通知。 而这种设计方式导致这个方法的执行性能比较慢。

    CompletableFuture

    所以,这里可以直接使用 CompletableFuture,(如图),也就是说把查询订单的逻辑放在一个异步线程池里面去处理。然后基于 CompletableFuture 的事件回调机制的特性,可以配置查询订单结束后自动触发支付,支付结束后自动触发邮件通知。从而极大的提升这个这个业务场景的处理性能

    事件驱动方式

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

    第一种,thenCombine(如图),把两个任务组合在一起,当两个任务都执行结束以后触发事件回调。
    第二种,thenCompose(如图),把两个任务组合在一起,这两个任务串行执行,也就是第一个任务执行完以后自动触发执行第二个任务。

    第三种,thenAccept(如图),第一个任务执行结束后触发第二个任务,并且第一个任务的执行结果作为第二个任务的参数,这个方法是纯粹接受上一个任务的结果,不返回新的计算值。

     

    第四种,thenApply(如图),和 thenAccept 一样,但是它有返回值。

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

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

    CallableFuture​​​​​​​

    1. Callable: Callable 是类似于 Runnable 的接口,不同之处在于它可以在任务执行完成后返回一个结果,以及能够抛出受检查的异常。Callable 接口是一个参数化的接口,通常与 ExecutorService 结合使用,用于提交并执行多线程任务。Callable 接口只包含一个方法 call(),该方法会返回一个泛型类型的结果,同时允许抛出异常。

    2. Future: Future 表示一个可能还没有完成的异步任务的结果。它提供了方法来检查任务是否完成,等待任务的完成,以及检索任务的结果。通过 Future,我们可以在主线程中获取异步任务的执行结果,或者取消任务的执行。在与 Callable 结合使用时,ExecutorServicesubmit 方法会返回一个 Future 对象,通过该对象可以获取异步任务的执行结果。

    通常情况下,我们可以通过以下步骤使用 CallableFuture

    1. 创建一个实现 Callable 接口的任务。
    2. 将该任务提交给 ExecutorService,获得一个 Future 对象。
    3. 通过 Future 对象可以在需要的时候获取任务的执行结果,或者取消任务的执行。
    1. import java.util.concurrent.Callable;
    2. import java.util.concurrent.ExecutorService;
    3. import java.util.concurrent.Executors;
    4. import java.util.concurrent.Future;
    5. public class CallableAndFutureExample {
    6. public static void main(String[] args) {
    7. ExecutorService executor = Executors.newSingleThreadExecutor();
    8. // 创建一个 Callable 任务
    9. Callable<Integer> task = () -> {
    10. int n = 10; // 计算斐波那契数列的第 10 个数
    11. int a = 0, b = 1;
    12. for (int i = 0; i < n; i++) {
    13. int temp = a + b;
    14. a = b;
    15. b = temp;
    16. }
    17. return a;
    18. };
    19. // 提交任务并获取 Future 对象
    20. Future<Integer> future = executor.submit(task);
    21. // 进行其他操作...
    22. try {
    23. // 获取任务的执行结果,如果任务还没有完成则会阻塞等待
    24. int result = future.get();
    25. System.out.println("斐波那契数列的第 10 个数是:" + result);
    26. } catch (Exception e) {
    27. System.err.println("任务执行出现异常:" + e.getMessage());
    28. }
    29. // 关闭 ExecutorService
    30. executor.shutdown();
    31. }
    32. }

    总之,CallableFuture 接口为多线程编程提供了更加灵活和强大的异步任务处理能力,使得我们可以方便地执行异步任务并获取其结果。

    • Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值。可以认为是带有回调的Runnable。
    • Future接口表示异步任务,是还没有完成的任务给出的未来结果。所以说Callable用于产生结果,Future用于获取结果。
  • 相关阅读:
    教师资格证报名浏览器不兼容 - 解决方案
    c语言实现https客户端 源码+详细注释(OpenSSL下载,visual studio编译器环境配置)
    754、到达终点数字
    tcpdump常用命令
    强化您的应用安全,从app加固开始
    Kubernetes(1): kubernetes介绍
    计算机毕设(附源码)JAVA-SSM京津冀畅游网设计
    Revopoint的3D输出格式及转换工具
    8086寄存器和常用指令缩写还原
    计算机毕业设计选题推荐-课程教学平台-Java/Python项目实战
  • 原文地址:https://blog.csdn.net/qq_63431773/article/details/134089283