赞
踩
java可以满足多任务之间的依赖协作关系,在java1.8新增了一种新的方式,主要涉及CompletionStage。
支持任务异步处理,满足多任务之间的依赖协作关系。例如之前需要用callback,现在定义依赖关系。
代表一个异步的阶段,当一个CompletionStage完成后去执行另一个行为或计算。一个阶段正常结束后,可以顺序触发某些其他的依赖阶段。根据使用场景,接口定义了几组行为。
行为之一:使用Function、Comsumer、Runnable作为阶段行为的表现方式,依据上一阶段正常结束的结果是否作为下一阶段参数等因素来决定,如方法名中包含apply, accept, or run。注意:上一阶段必须正常结束,否则不会触发下一阶段。
行为之一:支持多种触发阶段行为的方式,如一个单独的阶段结束后(方法名包含then)、两个阶段都结束后(方法名包含both)、两个阶段中任一结束后(方法名包含either)。注意:上一阶段必须正常结束,否则不会触发下一阶段。
行为之一:依赖阶段的触发行为,不保证明确的顺序。同步执行、异步执行、自定义executor的异步执行。
行为之一:关注上一阶段的结果,无论正常结束还是异常结束。
whenComplete | 关注阶段的结果(包括正常结束结果和异常结果)。无法改变结果的引用。若通过get或join获取结果,是异常结果则抛出异常;若不调用get或join,即使是异常结果,也不会抛出异常。 |
handle | 关注阶段的结果(包括正常结果和异常结果),而且可以返回新的正常结果,异常不会被抛出。 |
实现Future,允许干预阶段的生命周期,而且可以获取阶段结果。当多个线程对同一个阶段执行 complete, completeExceptionally, or cancel时,只有一个会成功。
使用不包含async的方法添加的依赖,由执行上一阶段的线程执行或其他主动complete上一阶段的线程执行。
使用栈存放依赖阶段。
以下是常见的一种业务流程的过程:
上述这个过程涉及多个任务且存在依赖关系,可以使用CompletionFuture。
例如
- CompletableFuture<Integer> completableFuture1 = CompletableFuture.supplyAsync(supplierTask1);
- CompletableFuture<Integer> completableFuture2 = CompletableFuture.supplyAsync(supplierTask2);
- CompletableFuture<Integer> completableFuture3 = CompletableFuture.supplyAsync(supplierTask3);
- CompletableFuture<Integer> completableFuture4 = CompletableFuture.supplyAsync(supplierTask4);
-
- CompletableFuture<Void> 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());
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。