Java异步编程(一):CompletableFuture初步介绍

1、概述

大家好,我是欧阳方超。本次就Java中CompletableFuture做初步介绍。

2、关于CompletableFuture

CompletableFuture是Java8中引入的一个用于异步计算的类。它允许我们异步地执行计算,并在计算完成后获取结果或继续处理结果。

2.1、主要用法

主要使用方式如下:

  • supplyAsync:异步供给一个值。
    例如:
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 1);
  • runAsync:异步执行一个任务。
    例如:
CompletableFuture.runAsync(() -> {
    
     /* 异步任务 */ });
  • thenApply:执行后续操作。
    例如:
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 1)
               .thenApply(x -> x + 1);
  • thenAccept :执行 Consumer 操作。
    例如:
future.thenAccept(x -> {
    
     /* ... */ });
在这里插入代码片
  • get():获取异步计算的结果。
    例如:
Integer result = future.get();
  • join():等待异步计算完成。

2.2、示例

下面通过一个例子体会CompletableFuture的使用。

public class Main {
    
    
    public static void main(String[] args) throws ExecutionException, InterruptedException {
    
    
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    
    
            return "你好";
        });

        future.thenAccept(s -> {
    
    
            System.out.println(s);
        });
    }
}

程序输出结果:

你好

在上面的示例中,首先使用CompletableFuture.supplyAsync()创建了一个CompletableFuture,该Future会异步执行一个返回String的生产者(supplier),其次future.thenAccept()注册了一个消费者(Consumer),当Future的计算完成后,会自动调用该消费之,并将结果作为参数传入,最终打印“你好”。
执行流程大致如下:
主线程调用supplyAsync()提交一个异步任务;
主线程继续执行,不等待该异步任务;
当异步任务执行完成后,它会自动触发thenAccept()中注册的回调Consumer,并把结果传入;
该Consumer被调用,打印结果;
主线程无需关心异步任务的执行,也不需要手动获取其结果。一切都由CompletableFuture自动完成。

CompletableFuture做到了异步任务和回调操作逻辑分离,而且开发者不用自己创建线程池,其底层使用的是ForkJoinPool相关方法实现的。

3、总结

这就是CompletableFuture的基本思想,它允许我们提交异步任务,并注册回调,当异步任务完成时,回调会自动触发。我们把一系列的异步任务和回调串联起来,就可以实现复杂的异步流程控制。
我是欧阳方超,把事情做好了自然就有兴趣了,如果你喜欢我的文章,欢迎点赞、转发、评论加关注。我们下次见。

猜你喜欢

转载自blog.csdn.net/u012288582/article/details/130937610