Java 异步编程进阶:CompletableFuture 完全指南

在现代应用程序开发中,异步编程已经成为不可或缺的一部分。Java提供了许多用于异步编程的工具和框架,其中最强大的之一是 CompletableFuture。CompletableFuture 不仅简化了异步任务的管理,而且提供了丰富的 API,使得开发人员可以轻松地实现复杂的异步操作。本文将深入探讨 CompletableFuture 的使用方法和最佳实践,帮助您充分利用这一强大的工具。

一、Future接口以及它的局限性

我们都知道,Java中创建线程的方式主要有两种方式,继承Thread或者实现Runnable接口。但是这两种都是有一个共同的缺点,那就是都无法获取到线程执行的结果,也就是没有返回值。于是在JDK1.5 以后为了解决这种没有返回值的问题,提供了Callable和Future接口以及Future对应的实现类FutureTask,通过FutureTask的就可以获取到异步执行的结果。
于是乎,我们想要开启异步线程,执行任务,获取结果,就可以这么实现。

 FutureTask<String> futureTask = new FutureTask<>(() -> "三友");
 new Thread(futureTask).start();
 System.out.println(futureTask.get());

或者使用线程池的方式

ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<String> future = executorService.submit(() -> "三友");
System.out.println(future.get());
executorService.shutdown();

线程池底层也是将提交的Callable的实现先封装成FutureTask,然后通过execute方法来提交任务,执行异步逻辑。

二、Future接口的局限性

虽然通过Future接口的get方法可以获取任务异步执行的结果,但是get方法会阻塞主线程,也就是异步任务没有完成,主线程会一直阻塞,直到任务结束。
Future也提供了isDone方法来查看异步线程任务执行是否完成,如果完成,就可以获取任务的执行结果,代码如下。

ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<String> future = executorService.submit(() -> "三友");
while (!future.isDone()) {
   
   
  //任务有没有完成,没有就继续循环判断
}
System.out.println(future.get());
executorService.shutdown();

但是这种轮询查看异步线程任务执行状态,也是非常消耗cpu资源。
同时对于一些复杂的异步操作任务的处理,可能需要各种同步组件来一起完成。
所以,通过上面的介绍可以看出,Future在使用的过程中还是有很强的局限性,所以为了解决这种局限性,在JDK1.8的时候,Doug Lea 大神为我们提供了一种更为强大的类CompletableFuture。

三、CompletableFuture 简介

CompletableFuture 是 Java 8 引入的一个类,用于异步编程。它实现了 Future 接口,并添加了许多额外的方法,使得异步编程更加灵活和强大。与传统的 Future 相比,CompletableFuture 允许我们显式地完成一个异步任务,而不必等待其完成。

四、CompletableFuture常见api详解

1. 创建 CompletableFuture

首先,让我们看看如何创建一个 CompletableFuture 实例。CompletableFuture 提供了两个静态方法来执行异步任务:supplyAsync 和 runAsync。

1.1 supplyAsync 方法

CompletableFuture<String> future = CompletableFuture.supplyAsync
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值