CompletableFuture 是 JDK1.8 里面引入的一个基于事件驱动的异步回调类。简单来说,就是当使用异步线程去执行一个任务的时候,我们希望在任务结束以后触发一个后续的动作。而 CompletableFuture 就可以实现这个功能。
CompletableFuture 提供了 5 种不同的方式,把多个异步任务组成一个具有先后关系的处理链,然后基于事件驱动任务链的执行。
第四种,thenApply(如图),和 thenAccept 一样,但是它有返回值。
第五种,thenRun(如图),就是第一个任务执行完成后触发执行一个实现了 Runnable 接口的任务。
Callable: Callable
是类似于 Runnable
的接口,不同之处在于它可以在任务执行完成后返回一个结果,以及能够抛出受检查的异常。Callable
接口是一个参数化的接口,通常与 ExecutorService
结合使用,用于提交并执行多线程任务。Callable
接口只包含一个方法 call()
,该方法会返回一个泛型类型的结果,同时允许抛出异常。
Future: Future
表示一个可能还没有完成的异步任务的结果。它提供了方法来检查任务是否完成,等待任务的完成,以及检索任务的结果。通过 Future
,我们可以在主线程中获取异步任务的执行结果,或者取消任务的执行。在与 Callable
结合使用时,ExecutorService
的 submit
方法会返回一个 Future
对象,通过该对象可以获取异步任务的执行结果。
通常情况下,我们可以通过以下步骤使用 Callable
和 Future
:
Callable
接口的任务。ExecutorService
,获得一个 Future
对象。Future
对象可以在需要的时候获取任务的执行结果,或者取消任务的执行。- import java.util.concurrent.Callable;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.Future;
-
- public class CallableAndFutureExample {
- public static void main(String[] args) {
- ExecutorService executor = Executors.newSingleThreadExecutor();
-
- // 创建一个 Callable 任务
- Callable<Integer> task = () -> {
- int n = 10; // 计算斐波那契数列的第 10 个数
- int a = 0, b = 1;
- for (int i = 0; i < n; i++) {
- int temp = a + b;
- a = b;
- b = temp;
- }
- return a;
- };
-
- // 提交任务并获取 Future 对象
- Future<Integer> future = executor.submit(task);
-
- // 进行其他操作...
-
- try {
- // 获取任务的执行结果,如果任务还没有完成则会阻塞等待
- int result = future.get();
- System.out.println("斐波那契数列的第 10 个数是:" + result);
- } catch (Exception e) {
- System.err.println("任务执行出现异常:" + e.getMessage());
- }
-
- // 关闭 ExecutorService
- executor.shutdown();
- }
- }
总之,Callable
和 Future
接口为多线程编程提供了更加灵活和强大的异步任务处理能力,使得我们可以方便地执行异步任务并获取其结果。