CompletableFuture入门:Java异步编程新选择

 
更多

在Java中,异步编程是一种重要的开发方式,尤其是对于处理IO密集型任务时,使用异步编程可以提高应用程序的性能和响应速度。而在Java 8中,引入了CompletableFuture类,它提供了一种简单而强大的方式来实现异步编程。

CompletableFuture的概述

CompletableFuture是一个实现了Future接口的类,它提供了非常便捷的API来执行异步任务,并处理任务的结果或异常。与传统的Future相比,CompletableFuture具有更为丰富的功能和更高的灵活性。

使用CompletableFuture,我们可以以更直观的方式实现异步编程,而不需要手动操作线程或回调函数。它的API提供了很多方法,可以方便地处理以异步方式执行的任务的结果,包括对结果的转换、组合、链式调用等。

CompletableFuture的基本用法

CompletableFuture的使用非常简单,我们可以通过CompletableFuture.supplyAsyncCompletableFuture.runAsync方法来创建一个CompletableFuture。

// 异步执行一个任务, 返回一个CompletableFuture
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 执行某个耗时任务
    return "Hello, CompletableFuture!";
});

// 处理任务的结果
future.thenAccept(result -> {
    System.out.println("Result: " + result);
});

// 阻塞等待结果的完成
future.join();

上述代码中,CompletableFuture.supplyAsync方法接收一个Supplier作为参数,它表示异步任务的执行体。CompletableFuture对象可以直接调用thenAccept方法来处理任务的结果,当任务执行完成后,可以使用join方法来等待结果的完成。

CompletableFuture的组合使用

CompletableFuture提供了多个方法来实现任务的组合,使得我们可以以更简洁的方式实现复杂的异步编程逻辑。

串行组合

在CompletableFuture中,我们可以使用thenApplythenCompose方法来实现串行的任务组合。

thenApply方法接收一个函数(Function)作为参数,它对前一个任务的结果进行转换,并返回一个新的CompletableFuture:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 执行某个耗时任务
    return "Hello, ";
}).thenApply(result -> result + "CompletableFuture!");

future.thenAccept(result -> {
    System.out.println("Result: " + result);
});

future.join();

thenCompose方法则用于处理前一个任务的结果,并返回下一个CompletableFuture:

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
    // 执行某个耗时任务并返回结果
    return "Hello";
});

CompletableFuture<String> future2 = future1.thenCompose(result -> CompletableFuture.supplyAsync(() -> {
    // 基于前一个任务的结果执行另一个耗时任务
    return result + ", CompletableFuture!";
}));

future2.thenAccept(result -> {
    System.out.println("Result: " + result);
});

future2.join();

并行组合

CompletableFuture还提供了一些方法来实现任务的并行组合,包括thenCombineallOf

thenCombine方法可以将两个CompletableFuture的结果进行合并,并返回一个新的CompletableFuture。

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
    // 执行耗时任务,返回结果
    return "Hello, ";
});

CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
    // 执行耗时任务,返回结果
    return "CompletableFuture!";
});

CompletableFuture<String> future3 = future1.thenCombine(future2, (result1, result2) -> result1 + result2);

future3.thenAccept(result -> {
    System.out.println("Result: " + result);
});

future3.join();

allOf方法可以等待多个CompletableFuture的所有任务都完成。

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
    // 执行耗时任务,返回结果
    return "Hello, ";
});

CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
    // 执行耗时任务,返回结果
    return "CompletableFuture!";
});

CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2);

allFutures.thenRun(() -> {
    System.out.println("All tasks completed!");
});

allFutures.join();

CompletableFuture的异常处理

在CompletableFuture中,我们可以使用exceptionallyhandle方法来处理任务中的异常。

exceptionally方法可以处理任务的异常,并返回一个默认值:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    throw new RuntimeException("Exception in task");
});

future.exceptionally(ex -> {
    System.out.println("Exception: " + ex.getMessage());
    return "Default value";
}).thenAccept(result -> {
    System.out.println("Result: " + result);
});

future.join();

handle方法可以处理任务的结果,无论是否发生异常,都会执行相应的逻辑:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    throw new RuntimeException("Exception in task");
});

future.handle((result, ex) -> {
    if (ex != null) {
        System.out.println("Exception: " + ex.getMessage());
        return "Default value";
    } else {
        return result;
    }
}).thenAccept(result -> {
    System.out.println("Result: " + result);
});

future.join();

总结

CompletableFuture在Java中提供了一种简单而强大的方式来实现异步编程。它的丰富的API以及方便的任务组合和异常处理方式,使得我们可以以一种直观而便捷的方式编写异步代码。通过合理地使用CompletableFuture,我们可以提高Java应用程序的性能和并发能力,同时提供更好的用户体验。

参考资料:

  • Java 8 CompletableFuture Tutorial with Examples

打赏

本文固定链接: https://www.cxy163.net/archives/7314 | 绝缘体

该日志由 绝缘体.. 于 2021年10月27日 发表在 未分类 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: CompletableFuture入门:Java异步编程新选择 | 绝缘体
关键字: , , , ,

CompletableFuture入门:Java异步编程新选择:等您坐沙发呢!

发表评论


快捷键:Ctrl+Enter