Asynchrone Programmierung in Java: Vollständiger Leitfaden mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einführung in die asynchrone Programmierung in Java



Asynchrone Programmierung ist ein Entwicklungsparadigma, bei dem die Ausführung langwieriger Operationen (z. B. Netzwerkanfragen, Dateilesen oder Berechnungen) den Hauptthread der Anwendung nicht blockiert. In Java hat dieses Konzept einen langen Entwicklungsweg durchlaufen: von einfachen Threads (Thread) bis hin zu leistungsstarken Abstraktionen wie CompletableFuture und reaktiven Streams.



In der modernen Entwicklung ist Asynchronität entscheidend für die Erstellung reaktionsschneller Webserver, hochbelasteter Microservices und effizienter Datenverarbeiter. Diese Anleitung hilft Ihnen, alle wichtigen Aspekte der asynchronen Programmierung in Java zu meistern, von den Grundlagen bis zu fortgeschrittenen Techniken.



Grundlagen: Threads und ExecutorService



Das Problem blockierender Operationen



Traditioneller synchroner Code blockiert den Thread, bis die Operation abgeschlossen ist. Zum Beispiel bei der Ausführung einer HTTP-Anfrage:



public String fetchData() throws InterruptedException {    Thread.sleep(2000); // Simulation einer langen Anfrage    return "Daten empfangen";}


Während die Methode fetchData() ausgeführt wird, kann der Thread keine anderen Anfragen bearbeiten. In Multithread-Anwendungen führt dies zu einer ineffizienten Ressourcennutzung.



ExecutorService — Verwaltung eines Thread-Pools



Java stellt ExecutorService zur Verwaltung eines Thread-Pools bereit. Anstatt manuell neue Threads zu erstellen, verwenden Sie einen fertigen Pool:



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 "Berechnungsergebnis"; }); System.out.println("Warte auf Ergebnis..."); String result = future.get(); // Blockiert den Thread, bis das Ergebnis vorliegt System.out.println("Erhalten: " + result); executor.shutdown(); }}


Wichtig: Future.get() ist eine blockierende Operation. Für echte Asynchronität werden fortgeschrittenere Werkzeuge benötigt.



CompletableFuture: Leistungsstarke Asynchronität



Seit Java 8 ist CompletableFuture das wichtigste Werkzeug für asynchrone Programmierung. Es ermöglicht die Erstellung von Ketten asynchroner Operationen ohne Thread-Blockierung.



Erstellung und grundlegende Operationen



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

public class CompletableFutureExample { public static void main(String[] args) throws ExecutionException, InterruptedException { // Asynchrone Ausführung CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return "Asynchrones Ergebnis"; }); // Nicht blockierende Ergebnisverarbeitung future.thenAccept(result -> System.out.println("Verarbeitet: " + result)); System.out.println("Hauptthread arbeitet weiter..."); // Blockierung zum Beenden des Programms future.get(); }}


Verkettungen und Kombinationen



Einer der Hauptvorteile von CompletableFuture ist die Möglichkeit, komplexe Ketten asynchroner Operationen zu erstellen:



public class AsyncChainExample {    public static void main(String[] args) throws ExecutionException, InterruptedException {        CompletableFuture.supplyAsync(() -> {            System.out.println("Schritt 1: Daten abrufen");            return "user_123";        })        .thenApp                

Blogs

Buchempfehlungen