日常开发中,尤其在微服务架构盛行的时代,服务之间的调用会通过RPC方式,抛开同步调用,在涉及多RPC调用时,往往会有任务编排动作,而如何优雅的实现任务编排,CompletableFutrue便随之而来了
-
/** * @author yangxj * @date 2020-07-23 09:56 */ public class TestDemo { public static void main(String[] args) throws Exception { // 任务A 执行耗时需要3s CompletableFuture<Integer> taskA = CompletableFuture.supplyAsync(() -> { System.out.println("task A 执行"); try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("task A 执行完毕"); return 1; }); // 任务A执行发生异常返回0 taskA.exceptionally((e) -> 0); // 任务A执行结果消费 taskA.thenAccept(result -> System.out.println("taskA.thenAccept: " + result)); // 结果 1 // 对任务A执行结果后续操作 taskA.thenApply((taskA_result) -> taskA_result * 2).thenAccept(result -> System.out.println("taskA.thenApply: " + result)); // 结果 2 // 任务B 执行耗时需要2s CompletableFuture<Integer> taskB = CompletableFuture.supplyAsync(() -> { System.out.println("task B 执行"); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("task B 执行完毕"); return 2; }); // 任意任务执行完毕 taskA.acceptEither(taskB, result -> System.out.println("taskA.acceptEither : " + result)); // taskB 耗时短 故结果为 2 // 任务都执行完毕 taskA.thenAcceptBoth(taskB, (taskA_result, taskB_result) -> System.out.println("taskA.thenAcceptBoth: " + taskA_result + ", " + taskB_result)); // 结果 1, 2 // 总结 either 与 both 区别在于,either是任意任务完成就返回结果,both需要任务都执行完毕 // 对两个任务结果的后续处理 taskA.thenCombine(taskB, (taskA_result, taskB_result) -> taskA_result + taskB_result).thenAccept(System.out::println); // 结果 3 // 任意任务执行完毕 CompletableFuture.anyOf(taskA, taskB).thenAccept(System.out::println); // 结果 2 // 任务都执行完毕 CompletableFuture.allOf(taskA, taskB).join(); TimeUnit.SECONDS.sleep(10); // 主线程等待 } }
浙公网安备 33010602011771号