CompletableFuture

发布时间 2023-05-27 19:39:00作者: 钟鼎山林

 

 

 

 

一、异步任务创建

1.1、runAsync

分析源码:依靠创建一个Runnable() 接口实现类  对象   返回 CompletableFuture<Void>

public static CompletableFuture<Void> runAsync(Runnable runnable) {
        return asyncRunStage(asyncPool, runnable);
    }

底层通过  开启一个线程去执行

public static void main(String[] args) throws InterruptedException {

        System.out.println("主线程程序开始 执行");

        // 使用实现Runnable 匿名内部类
        CompletableFuture.runAsync(new Runnable() {
            @Override
            public void run() {
                System.out.println("异步线程执行异步任务");
            }
        });

        System.out.println("主线程程序执行  结束 ");

    }

 

用Lambda 简写

public static void main(String[] args) throws InterruptedException {

        System.out.println("程序开始 执行");

        // 使用实现Runnable 匿名内部类
        CompletableFuture.runAsync(() -> {
            System.out.println("异步线程执行异步任务");
        });

        // 让主线程睡3秒,等待一下异步任务执行
        Thread.sleep(3000);

        System.out.println("程序执行  结束 ");

    }

 

 

1.2、supplyAsync

实现一个或传入一个 Supplier<U> 对象,返回一个 CompletableFuture<U>

U 传入的对象类型

    public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {
        return asyncSupplyStage(asyncPool, supplier);
    }

 

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        System.out.println("主线程  开始执行");

        CompletableFuture<String> newFuture = CompletableFuture.supplyAsync(() -> {

            String threadName = Thread.currentThread().getName();
            String st = "异步任务";
            System.out.println("正在执行异步任务的子线程:" + threadName);
            return st;

        });

        // 会阻塞异步任务线程 等待获取到结果
        String result = newFuture.get();
        System.out.println("异步结果:" + result);

        System.out.println("主线程 执行结束");
        
    }