• java支持多任务之间的依赖协作关系


    java可以满足多任务之间的依赖协作关系,在java1.8新增了一种新的方式,主要涉及CompletionStage。

    1. 概述

    支持任务异步处理,满足多任务之间的依赖协作关系。例如之前需要用callback,现在定义依赖关系。

    2. 详情

    代表一个异步的阶段,当一个CompletionStage完成后去执行另一个行为或计算。一个阶段正常结束后,可以顺序触发某些其他的依赖阶段。根据使用场景,接口定义了几组行为。

    行为之一:使用Function、Comsumer、Runnable作为阶段行为的表现方式,依据上一阶段正常结束的结果是否作为下一阶段参数等因素来决定,如方法名中包含apply, accept, or run。注意:上一阶段必须正常结束,否则不会触发下一阶段。

    行为之一:支持多种触发阶段行为的方式,如一个单独的阶段结束后(方法名包含then)、两个阶段都结束后(方法名包含both)、两个阶段中任一结束后(方法名包含either)。注意:上一阶段必须正常结束,否则不会触发下一阶段。

    行为之一:依赖阶段的触发行为,不保证明确的顺序。同步执行、异步执行、自定义executor的异步执行。

    行为之一:关注上一阶段的结果,无论正常结束还是异常结束。

    whenComplete关注阶段的结果(包括正常结束结果和异常结果)。无法改变结果的引用。若通过get或join获取结果,是异常结果则抛出异常;若不调用get或join,即使是异常结果,也不会抛出异常。
    handle关注阶段的结果(包括正常结果和异常结果),而且可以返回新的正常结果,异常不会被抛出。

    3. 实现类CompletionFuture

    实现Future,允许干预阶段的生命周期,而且可以获取阶段结果。当多个线程对同一个阶段执行 complete, completeExceptionally, or cancel时,只有一个会成功。

    使用不包含async的方法添加的依赖,由执行上一阶段的线程执行或其他主动complete上一阶段的线程执行。 

    使用栈存放依赖阶段。

    4. 应用举例

    以下是常见的一种业务流程的过程:

    1. 任务A,获取用户信息;
    2. 多个任务,依赖用户信息,通过多个远程调用获取多种数据;
    3. 依赖多任务的结果,进行数据聚合。

    上述这个过程涉及多个任务且存在依赖关系,可以使用CompletionFuture。

    例如

    1. CompletableFuture<Integer> completableFuture1 = CompletableFuture.supplyAsync(supplierTask1);
    2. CompletableFuture<Integer> completableFuture2 = CompletableFuture.supplyAsync(supplierTask2);
    3. CompletableFuture<Integer> completableFuture3 = CompletableFuture.supplyAsync(supplierTask3);
    4. CompletableFuture<Integer> completableFuture4 = CompletableFuture.supplyAsync(supplierTask4);
    5. CompletableFuture<Void> completableFuture5 = CompletableFuture
    6. .allOf(completableFuture1, completableFuture2, completableFuture3, completableFuture4);
    7. completableFuture5.join();
    8. System.out.println(completableFuture1.isDone() + " " + completableFuture1.join());
    9. System.out.println(completableFuture2.isDone() + " " + completableFuture2.join());
    10. System.out.println(completableFuture3.isDone() + " " + completableFuture3.join());
    11. System.out.println(completableFuture4.isDone() + " " + completableFuture4.join());

  • 相关阅读:
    2.MidBook经验之MybatisPlus
    [管理与领导-112]:IT人看清职场中的隐性规则 - 9 - 付出与回报的关系:先付出,后回报,不行就止损,这才是职场价值交换的本质
    ChatGLM2-6B 部署
    10、信息打点——APP&小程序篇&抓包封包&XP框架&反编译&资产提取
    nigix安装以及遇到的问题
    Java开始
    Linux命令之systemctl命令
    第14章_视图
    计算机网络4小时速成:物理层,功能特性,通信系统模型,分类,调制,曼彻斯特编码,信噪比,香农定理,复用技术,同轴电缆,中继器
    k8s的本质
  • 原文地址:https://blog.csdn.net/chl87783255/article/details/125423819