日常开发中,尤其在微服务架构盛行的时代,服务之间的调用会通过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); // 主线程等待
    
        }
    }

     

posted on 2020-08-06 11:01  yang希军  阅读(237)  评论(1)    收藏  举报