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。

例如

CompletableFuture completableFuture1 = CompletableFuture.supplyAsync(supplierTask1);
CompletableFuture completableFuture2 = CompletableFuture.supplyAsync(supplierTask2);
CompletableFuture completableFuture3 = CompletableFuture.supplyAsync(supplierTask3);
CompletableFuture completableFuture4 = CompletableFuture.supplyAsync(supplierTask4);

CompletableFuture completableFuture5 = CompletableFuture
                    .allOf(completableFuture1, completableFuture2, completableFuture3, completableFuture4);

completableFuture5.join();
System.out.println(completableFuture1.isDone() + " " + completableFuture1.join());
System.out.println(completableFuture2.isDone() + " " + completableFuture2.join());
System.out.println(completableFuture3.isDone() + " " + completableFuture3.join());
System.out.println(completableFuture4.isDone() + " " + completableFuture4.join());

你可能感兴趣的:(陈海龙的格物之路-JAVA篇,CompletionStage,java任务依赖,java异步)