返回

用情至深,读懂CompletableFuture主要方法

闲谈

驾驭Java并发编程的利器:CompletableFuture指南

前言

在瞬息万变的数字世界中,并发编程已成为现代软件开发的关键。Java并发编程提供了丰富的工具和技术,助力开发者打造高效、可扩展的应用程序。其中,CompletableFuture脱颖而出,它能够轻松管理异步任务和协调多个异步任务的执行。本文将深入探讨CompletableFuture提供的关键方法,包括thenAccept、thenRun、thenCompose、thenCombine、thenAcceptBoth、supplyAsync和runAsync,帮助您掌握这些方法的用途、行为和应用场景。

thenAccept:消费CompletableFuture的结果

thenAccept方法允许您对CompletableFuture的结果进行处理。它接收一个Consumer参数,当CompletableFuture完成时,该Consumer将被调用。Consumer可以执行广泛的操作,例如打印结果、将其存储到数据库或将其传递给另一个CompletableFuture。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello World!");

future.thenAccept(System.out::println);

这段代码使用supplyAsync方法创建了一个CompletableFuture,它将在单独的线程中执行并返回一个字符串。随后,它使用thenAccept方法对CompletableFuture的结果进行处理。thenAccept方法接收Consumer作为参数,在CompletableFuture完成时将调用该Consumer。本例中的Consumer是System.out::println,它会将CompletableFuture的结果打印到控制台。

thenRun:执行CompletableFuture完成后的任务

thenRun方法与thenAccept方法类似,但它不接收任何参数。相反,它接收一个Runnable参数,当CompletableFuture完成时,该Runnable将被调用。Runnable可以执行任何任务,例如打印消息或更新UI。

CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
    // do something
});

future.thenRun(() -> System.out.println("Task completed"));

这段代码使用runAsync方法创建了一个CompletableFuture,它将在单独的线程中执行并返回Void。随后,它使用thenRun方法对CompletableFuture的结果进行处理。thenRun方法接收Runnable作为参数,在CompletableFuture完成时将调用该Runnable。本例中的Runnable是System.out::println,它将消息"Task completed"打印到控制台。

thenCompose:将一个CompletableFuture的结果转换为另一个CompletableFuture

thenCompose方法允许您将一个CompletableFuture的结果转换为另一个CompletableFuture。它接收一个Function参数,该Function以CompletableFuture的结果作为输入,并返回一个新的CompletableFuture。新创建的CompletableFuture将在第一个CompletableFuture完成后立即执行。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello World!");

future.thenCompose(s -> CompletableFuture.supplyAsync(() -> s + "!"))
    .thenAccept(System.out::println);

这段代码使用supplyAsync方法创建了一个CompletableFuture,它将在单独的线程中执行并返回一个字符串。随后,它使用thenCompose方法将第一个CompletableFuture的结果转换为另一个CompletableFuture。thenCompose方法接收Function作为参数,该Function以CompletableFuture的结果作为输入,并返回一个新的CompletableFuture。本例中的Function是s -> CompletableFuture.supplyAsync(() -> s + "!")。

thenCombine:合并两个CompletableFuture的结果

thenCombine方法允许您合并两个CompletableFuture的结果。它接收一个BiFunction参数,该BiFunction以两个CompletableFuture的结果作为输入,并返回一个合并后的结果。thenCombine方法在两个CompletableFuture都完成时才执行。

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World!");

future1.thenCombine(future2, (s1, s2) -> s1 + " " + s2)
    .thenAccept(System.out::println);

这段代码使用supplyAsync方法创建了两个CompletableFuture,它们将在单独的线程中执行并分别返回一个字符串。随后,它使用thenCombine方法合并两个CompletableFuture的结果。thenCombine方法接收BiFunction作为参数,该BiFunction以两个CompletableFuture的结果作为输入,并返回一个合并后的结果。本例中的BiFunction是(s1, s2) -> s1 + " " + s2。

thenAcceptBoth:处理两个CompletableFuture的结果

thenAcceptBoth方法允许您处理两个CompletableFuture的结果。它接收一个BiConsumer参数,该BiConsumer以两个CompletableFuture的结果作为输入,并执行处理。thenAcceptBoth方法在两个CompletableFuture都完成时才执行。

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World!");

future1.thenAcceptBoth(future2, (s1, s2) -> System.out.println(s1 + " " + s2));

这段代码使用supplyAsync方法创建了两个CompletableFuture,它们将在单独的线程中执行并分别返回一个字符串。随后,它使用thenAcceptBoth方法处理两个CompletableFuture的结果。thenAcceptBoth方法接收BiConsumer作为参数,该BiConsumer以两个CompletableFuture的结果作为输入,并执行处理。本例中的BiConsumer是(s1, s2) -> System.out.println(s1 + " " + s2)。

supplyAsync和runAsync:异步执行任务

supplyAsync和runAsync方法用于在单独的线程中异步执行任务。supplyAsync方法返回一个CompletableFuture,该CompletableFuture包含任务的返回值,而runAsync方法返回一个CompletableFuture,该CompletableFuture不包含返回值。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // do something and return a value
});

CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
    // do something
});

结论

CompletableFuture提供了丰富的工具和技术,助力开发者轻松管理异步任务和构建高效、可扩展的并发应用程序。通过理解thenAccept、thenRun、thenCompose、thenCombine、thenAcceptBoth、supplyAsync和runAsync等关键方法的用途、行为和应用场景,您可以充分利用CompletableFuture的强大功能,打造响应迅速、高性能的现代应用程序。

常见问题解答

  1. 什么是CompletableFuture?

CompletableFuture是一个Java并发编程工具,用于管理异步任务和协调多个异步任务的执行。

  1. thenAccept方法有什么作用?

thenAccept方法允许您对CompletableFuture的结果进行处理,例如打印结果、存储到数据库或传递给另一个CompletableFuture。

  1. thenRun方法与thenAccept方法有何不同?

thenRun方法与thenAccept方法类似,但它不接受参数,而是接收一个在CompletableFuture完成后执行的Runnable。

  1. 如何使用thenCompose方法将一个CompletableFuture的结果转换为另一个CompletableFuture?

thenCompose方法接收一个Function,该Function以CompletableFuture的结果作为输入,并返回一个新的CompletableFuture,在第一个CompletableFuture完成后立即执行。

  1. 如何使用thenCombine方法合并两个CompletableFuture的结果?

thenCombine方法接收一个BiFunction,该BiFunction以两个CompletableFuture的结果作为输入,并返回一个合并后的结果,在两个CompletableFuture都完成后执行。