多线程(59)CompletableFuture

CompletableFuture是Java 8引入的一个非常强大的并发工具,它实现了Future接口,并提供了更强大的异步操作能力。CompletableFuture可以手动完成并且可以构建异步执行的流水线。它的设计让它非常适合用来编写非阻塞的异步代码。

核心特性

  • 异步执行任务:允许你非阻塞地执行任务,不需要等待操作完成即可继续执行。
  • 链式调用 :可以将多个CompletableFuture任务串联或组合起来,形成一个链或树。
  • 手动完成:可以手动完成一个任务,即可以手动设置它的结果或异常。
  • 组合式异步编程:提供了丰富的API,支持更复杂的异步编程模式,而不仅仅是简单地启动和等待。

源码解析(简化)

CompletableFuture的实现基于ForkJoinPool,利用了Java的ForkJoin框架来执行异步任务。关键的方法包括supplyAsyncthenApplythenAccept等,用于构建异步任务的执行流。

java 复制代码
public class CompletableFuture<T> implements Future<T>, CompletionStage<T> {
    // 使用ForkJoinPool异步执行任务
    public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {
        CompletableFuture<U> f = new CompletableFuture<U>();
        ForkJoinPool.commonPool().execute(() -> {
            try {
                f.complete(supplier.get());
            } catch (Throwable ex) {
                f.completeExceptionally(ex);
            }
        });
        return f;
    }
    // 其他方法...
}

代码演示

下面是一个示例,展示如何使用CompletableFuture来异步执行任务,并处理结果。

java 复制代码
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;

public class CompletableFutureDemo {
    
    public static void main(String[] args) {
        // 使用CompletableFuture异步执行一个供应者任务
        CompletableFuture<String> future = CompletableFuture.supplyAsync(new Supplier<String>() {
            @Override
            public String get() {
                // 模拟长时间运行的任务
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return "Hello, CompletableFuture!";
            }
        });
        
        // 注册一个回调函数,当异步任务完成时被调用
        future.thenAccept(result -> System.out.println(result));

        // 阻塞当前线程,等待异步操作完成
        future.join();
        
        System.out.println("任务完成!");
    }
}

注意事项

  • 异常处理CompletableFuture提供了exceptionally方法来处理异步执行中的异常。
  • 线程使用 :默认情况下,CompletableFuture使用公共的ForkJoinPool,但可以通过重载的方法指定不同的执行器。
  • 阻塞与非阻塞joinget方法用于阻塞当前线程直到Future完成,但在CompletableFuture的异步编程模式中,更推荐使用非阻塞的方式,即通过注册回调函数来处理结果。

总结,CompletableFuture提供了一种强大且灵活的方式来处理异步编程,能够简化代码并提升性能。通过它提供的丰富API,开发者可以轻松实现复杂的异步逻辑,编写清晰且易于维护的并发程序。

相关推荐
蓝倾25 分钟前
如何使用Python通过API接口批量抓取小红书笔记评论?
前端·后端·api
aloha_30 分钟前
Flowable 引擎在启动时没办法找到AsyncListenableTaskExecutor类型的 bean
后端
保持学习ing31 分钟前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
超级小忍1 小时前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
字节跳跃者1 小时前
为什么Java已经不推荐使用Stack了?
javascript·后端
字节跳跃者1 小时前
深入剖析HashMap:理解Hash、底层实现与扩容机制
javascript·后端
程序无bug1 小时前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
程序无bug1 小时前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队1 小时前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端
程序员NEO1 小时前
精控Spring AI日志
人工智能·后端