CompletableFuture常用方法

Posted moris5013

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CompletableFuture常用方法相关的知识,希望对你有一定的参考价值。

public class CompletableFutureTest {
    public static void main(String[] args) throws Exception {

        test5();

    }

    /**
     * whenCompleteAsync指的是异步执行传入的BiConsumer
     * whenComplete 指的是同步执行传入的BiConsumer
     */
    public static void  test1() throws ExecutionException, InterruptedException {
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "hello");
         //future.whenCompleteAsync((v, r) -> {
        future.whenComplete((v, r) -> {
            System.out.println("=========");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("====over=====");
        });
        System.out.println("^^^^^^^^^^");
        System.out.println(future.get());
        Thread.currentThread().join();
    }


    /**
     * 同样有异步和同步两种方法,thenApply没有异常处理
     * @throws ExecutionException
     * @throws InterruptedException
     */
    public static void  test2() throws ExecutionException, InterruptedException {
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> "hello")
                .thenApply((s) -> {
                    try {
                        System.out.println("==========");
                        TimeUnit.SECONDS.sleep(5);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("====over=====");
                    return s.length();
                });
//              .thenApplyAsync((s) -> {
//                    try {
//                        System.out.println("==========");
//                        TimeUnit.SECONDS.sleep(5);
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//                    System.out.println("====over=====");
//                    return s.length();
//                });
        System.out.println("^^^^^^^^^^");
        System.out.println(future.get());
        Thread.currentThread().join();
    }

    /**
     * handleAsync 有异常处理
     * @throws ExecutionException
     * @throws InterruptedException
     */
    public static void  test3() throws ExecutionException, InterruptedException {
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> "hello")
                .handleAsync((v, t) -> {
                    return v.length();
                });
        System.out.println(future.get());
    }

    /**
     * thenAcceptAsync 直接将上一个的结果进行消费
     * @throws ExecutionException
     * @throws InterruptedException
     */
    public static void  test4() throws ExecutionException, InterruptedException {
        CompletableFuture.supplyAsync(() -> "hello")
                .thenAcceptAsync((x) -> {
                    System.out.println(x);
                });
    }

    /**
     *执行完上一个future后再执行一个runnable
     * @throws ExecutionException
     * @throws InterruptedException
     */
    public static void  test5() throws ExecutionException, InterruptedException {
        CompletableFuture.supplyAsync(() -> "hello")
                .thenRunAsync(() -> {
                    System.out.println("====over===");
                });
    }
}

 

以上是关于CompletableFuture常用方法的主要内容,如果未能解决你的问题,请参考以下文章

CompletableFuture异步编排(线程串行化代码示例)

CompletableFuture异步编排(线程串行化代码示例)

CompletableFuture异步编排(计算完成回调代码示例)

CompletableFuture异步编排(计算完成回调代码示例)

CompletableFuture异步编排(多任务组合)

CompletableFuture异步编排(多任务组合)