Alors que les systèmes informatiques modernes deviennent de plus en plus complexes et volumineux, les performances de concurrence sont devenues un outil nécessaire pour résoudre des problèmes pratiques. Les méthodes de programmation synchrone traditionnelles ne peuvent plus répondre aux besoins des systèmes complexes. La programmation asynchrone est devenue un outil important permettant aux programmeurs modernes de développer des programmes hautes performances. CompleteableFuture introduit dans Java 8 est un mécanisme puissant de programmation asynchrone, qui peut grandement simplifier la complexité de la programmation asynchrone et améliorer la lisibilité et la maintenabilité du code. Cet article détaillera les concepts de base de CompletableFuture, la création et l'utilisation de tâches asynchrones, et comment gérer les résultats des tâches asynchrones.
CompletableFuture est une classe qui implémente l'interface Future. Il s'agit d'un nouvel outil de programmation asynchrone fourni par Java 8 pour exprimer les opérations asynchrones et traiter les résultats des opérations. Différent de l'interface Future, CompletableFuture fournit des outils plus puissants pour mieux exprimer les résultats des opérations asynchrones. La classe CompletableFuture prend en charge le chaînage de plusieurs opérations asynchrones pour former une chaîne d'opérations asynchrones en streaming, similaire à Observable dans le framework RxJava et AsyncTask dans Android.
Avec CompletableFuture, les développeurs peuvent facilement créer une logique de programmation asynchrone sans avoir à prendre en compte de nombreux détails de threading et de verrouillage. L'utilisation de CompletableFuture est également très simple et claire. Ils modifient la façon dont la programmation asynchrone est implémentée, réduisent les défauts de la programmation asynchrone basée sur le rappel et améliorent la lisibilité et la maintenabilité du code.
L'utilisation de base de CompletableFuture est de créer une chaîne d'opérations asynchrones. Vous pouvez utiliser les méthodes thenApplyAsync, thenComposeAsync, thenCombineAsync et thenAcceptAsync pour relier les opérations asynchrones entre elles. La méthode thenApplyAsync est utilisée pour appliquer un foncteur (fonction) à un autre résultat asynchrone pour créer une nouvelle tâche asynchrone ; la méthode thenComposeAsync est utilisée pour mapper et lier le résultat d'une opération asynchrone à une autre tâche asynchrone ; la méthode thenCombineAsync est utilisée pour combiner ; les résultats de deux opérations asynchrones et créer une nouvelle opération asynchrone ; la méthode thenAcceptAsync est utilisée pour consommer un résultat asynchrone.
Ce qui suit est un exemple simple montrant le modèle de programmation asynchrone de base :
// 异步执行任务1 CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello"); // 异步执行任务2,并在任务1完成之后执行 CompletableFuture<String> future2 = future1.thenApplyAsync(result -> result + " World"); // 等待任务2执行完成,并处理结果 future2.thenAcceptAsync(result -> System.out.println(result));
Ce code montre comment utiliser CompletableFuture pour créer un modèle de programmation asynchrone simple et puissant. chaîne d’opération. Tout d'abord, utilisez la méthode supplyAsync pour exécuter la tâche 1 de manière asynchrone. Cette méthode convertira une tâche synchrone en tâche asynchrone. Utilisez ensuite la méthode thenApplyAsync pour concaténer le résultat de la tâche 1 (« Bonjour ») avec la chaîne « Monde » et créez un nouvel objet chaîne qui représente une carte des résultats. Enfin, utilisez la méthode thenAcceptAsync pour traiter le résultat et l'imprimer. Cet exemple est très simple, mais il démontre les fonctionnalités de base de CompletableFuture, en particulier les capacités de programmation en chaîne et de programmation asynchrone.
CompletableFuture a trois états, à savoir :
Tout objet CompletableFuture n'a qu'un seul état d'achèvement ou d'exception et passera de l'état inachevé à un état final. Vous pouvez utiliser la méthode isDone pour vérifier si un CompletableFuture est terminé. Par exemple : future.isDone()
.
CompletableFuture propose de nombreuses méthodes pour retarder l'exécution d'une tâche asynchrone et traiter ses résultats. Voici quelques-unes des principales méthodes CompletableFuture :
我们来看一个更加复杂的例子,该例子将涉及到 CompletableFuture 的多种使用模式:
import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; public class CompletableFutureDemo { public static void main(String args[]) throws InterruptedException, ExecutionException { // 创建异步任务1 CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 2 + 3); // 创建异步任务2 CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 3 * 4); // 组合异步任务1和异步任务2,使用BiFunction对象作为组合函数 CompletableFuture<Integer> future3 = future1.thenCombineAsync(future2, (result1, result2) -> result1 * result2); // 创建异步任务3 CompletableFuture<Integer> future4 = CompletableFuture.supplyAsync(() -> 2 + 7); // 组合异步任务1和异步任务3,使用Function类型的函数 CompletableFuture<Integer> future5 = future1.thenComposeAsync(result -> CompletableFuture.supplyAsync(() -> result + 5)); // 组合异步任务1、异步任务2和异步任务3,使用组合函数,返回类型为Void CompletableFuture<Void> future6 = CompletableFuture.allOf(future1, future2, future4).thenAcceptAsync((Void) -> { try { System.out.println("The result of future1 is: " + future1.get()); System.out.println("The result of future2 is: " + future2.get()); System.out.println("The result of future4 is: " + future4.get()); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } }); // 等待所有异步任务执行完毕 CompletableFuture.allOf(future3, future5, future6).join(); } }
这段代码展示了 CompletableFutures 几种常用方法:suplyAsync、thenCombineAsync、thenComposeAsync和acceptAsync、allOf、isDone、join、get 和其他一些方法。我们首先定义了三个不同的 CompletableFuture 对象,根据不同的函数来完成,然后使用 thenCombineAsync 方法将这两个对象组合成一个对象。我们还使用 thenComposeAsync 构建了另一个异步结果,从这两个对象中获取了一些信息。最后,我们使用 allOf 方法来组合三个异步事件并在这三个异步操作完成后将它们组合在一个 Void 异步操作中,并使用 thenAcceptAsync 接受它们的值并将其打印到控制台上。
异步编程是一项复杂的任务,有很多复杂性,需要更多的时间和经验来正确地完成。我们需要明确异步编程的目的,并准确掌握 CompletableFuture 机制,才能写出简洁、精简、易维护的代码。
异步编程的另一个好处是提高应用程序的性能和吞吐量,因为我们可以为多个 CPU 核心优化和并发运行任务。然而,它也有一定的成本,包括更复杂的代码、需要加锁的数据结构和其他潜在的性能问题。但是,使用 CompletableFuture 进行异步编程,可以使代码更具可读性和可维护性,并减少程序员编写出还原异步操作的代码的负担。异步编程虽然存在挑战,但对于开发高性能应用程序至关重要。
这篇文章介绍了 CompletableFuture 和其在 Java 异步编程中的应用。CompletableFuture 类是一种强大的异步编程工具,可以帮助开发人员优雅地解决异步问题。虽然异步编程有一定的复杂性,但是通过理解 CompletableFuture 的基础和高级特性,我们可以优化代码并提高我们应用程序的性能。
总结起来,CompletableFuture 是 Java 8 提供的一种强大的异步编程工具,可用于解决异步操作的问题。CompletableFuture 可以通过链式编程来组成异步操作链,在提高效率的同时也为程序提供了更加优雅的代码实现方案。尽管异步编程带来了一些复杂性,需要开发人员在编写代码时更加小心,但当正确地使用 CompletableFuture 时,它可以帮助我们轻松地实现高效率、可维护和高质量的代码。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!