Programmation asynchrone en Java : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction à la programmation asynchrone en Java



La programmation asynchrone est un paradigme de développement dans lequel l'exécution d'opérations longues (par exemple, requêtes réseau, lecture de fichiers ou calculs) ne bloque pas le thread principal de l'application. En Java, ce concept a parcouru un long chemin d'évolution : des threads de base (Thread) aux abstractions puissantes comme CompletableFuture et les flux réactifs.



Dans le développement moderne, l'asynchronisme est crucial pour créer des serveurs web réactifs, des microservices à forte charge et des gestionnaires de données efficaces. Ce guide vous aidera à maîtriser tous les aspects clés de la programmation asynchrone en Java, des bases aux techniques avancées.



Fondamentaux : threads et ExecutorService



Le problème des opérations bloquantes



Le code synchrone traditionnel bloque le thread jusqu'à la fin de l'opération. Par exemple, lors de l'exécution d'une requête HTTP :



public String fetchData() throws InterruptedException {    Thread.sleep(2000); // Simulation d'une longue requête    return "Données reçues";}


Tant que la méthode fetchData() s'exécute, le thread ne peut pas traiter d'autres requêtes. Dans les applications multithreadées, cela conduit à une utilisation inefficace des ressources.



ExecutorService — gestion du pool de threads



Java fournit ExecutorService pour gérer un pool de threads. Au lieu de créer manuellement de nouveaux threads, vous utilisez un pool prêt à l'emploi :



import java.util.concurrent.*;

public class ExecutorExample { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executor = Executors.newFixedThreadPool(4); Future<String> future = executor.submit(() -> { Thread.sleep(2000); return "Résultat du calcul"; }); System.out.println("Attente du résultat..."); String result = future.get(); // Bloque le thread jusqu'à l'obtention du résultat System.out.println("Reçu : " + result); executor.shutdown(); }}


Important : Future.get() est une opération bloquante. Pour un véritable asynchronisme, des outils plus avancés sont nécessaires.



CompletableFuture : un asynchronisme puissant



Depuis Java 8, CompletableFuture est devenu l'outil principal pour la programmation asynchrone. Il permet de créer des chaînes d'opérations asynchrones sans bloquer les threads.



Création et opérations de base



import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;

public class CompletableFutureExample { public static void main(String[] args) throws ExecutionException, InterruptedException { // Exécution asynchrone CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return "Résultat asynchrone"; }); // Traitement non bloquant du résultat future.thenAccept(result -> System.out.println("Traité : " + result)); System.out.println("Le thread principal continue son travail..."); // Blocage pour terminer le programme future.get(); }}


Chaînes et combinaisons



L'un des principaux avantages de CompletableFuture est la possibilité de construire des chaînes complexes d'opérations asynchrones :



public class AsyncChainExample {    public static void main(String[] args) throws ExecutionException, InterruptedException {        CompletableFuture.supplyAsync(() -> {            System.out.println("Étape 1 : Obtention des données");            return "user_123";        })        .thenApp                

Blogs

Book Recommendations