Java 9 CompletableFuture API: Timeouts, Subclassing & neue Factory-Methoden
Überblick
CompletableFuture<T> (Java 8) repräsentiert einen asynchronen Berechnungswert. Java 9 fügt drei wichtige Erweiterungen hinzu:
- Unterstützung für Delays & Timeouts.
- Verbessertes Subclassing.
- Neue Factory-Methoden.
1. Delays & Timeouts
completeOnTimeout(T value, long timeout, TimeUnit unit)
Vervollständigt den Future erfolgreich mit value, falls er nicht vorher abgeschlossen wird (innerhalb von timeout).
CompletableFuture<String> future = longRunningTask()
.completeOnTimeout("Fallback-Wert", 5, TimeUnit.SECONDS);
orTimeout(long timeout, TimeUnit unit)
Vervollständigt den Future exceptionally mit TimeoutException, falls nicht vorher abgeschlossen.
CompletableFuture<String> future = longRunningTask()
.orTimeout(5, TimeUnit.SECONDS); // wirft TimeoutException bei Timeout
Unterschied: completeOnTimeout = Erfolg mit Fallback; orTimeout = Fehler bei Timeout.
2. Verbessertes Subclassing
Java 8 machte Subclassing schwer, da interne Factory-Methoden CompletableFuture Instanzen erzeugten.
Neue geschützte Methoden
// Standard-Executor für async-Operationen ohne expliziten Executor
public Executor defaultExecutor() { return ForkJoinPool.commonPool(); }
// Factory für neue inkomplette Futures desselben Subtyps
public <U> CompletableFuture<U> newIncompleteFuture() {
return new CompletableFuture<>(); // Subklassen sollten überschreiben
}
Best Practice für Subklassen:
public class MyFuture<T> extends CompletableFuture<T> {
@Override
public Executor defaultExecutor() {
return myCustomExecutor; // z. B. dedizierter Thread-Pool
}
@Override
public <U> MyFuture<U> newIncompleteFuture() {
return new MyFuture<>();
}
}
3. Neue statische Factory-Methoden
| Methode | Rückgabe | Beschreibung |
|---|---|---|
completedFuture(U value) |
CompletableFuture<U> |
Bereits erfolgreich abgeschlossener Future. |
completedStage(U value) |
CompletionStage<U> |
Bereits erfolgreich abgeschlossene Stage (nur Interface-Methoden). |
failedStage(Throwable ex) |
CompletionStage<U> |
Bereits fehlgeschlagene Stage mit Exception. |
Beispiele
// Sofort fertiger Future
CompletableFuture<String> ready = CompletableFuture.completedFuture("Fertig!");
// Für APIs, die nur CompletionStage erwarten
CompletionStage<Integer> stage = CompletableFuture.completedStage(42);
// Fehler-State erzeugen
CompletionStage<String> failed = CompletableFuture.failedStage(
new IllegalStateException("Geplant fehlgeschlagen")
);
Zusammenfassung der Neuerungen
| Feature | Methode(n) | Nutzen |
|---|---|---|
| Timeouts | completeOnTimeout, orTimeout |
Reaktive Systeme, Circuit Breaker, Fallback-Strategien |
| Subclassing | defaultExecutor, newIncompleteFuture |
Eigene Future-Typen mit custom Executor/Behavior |
| Factories | completedFuture, completedStage, failedStage |
Test-Doubles, Pre-computed Values, Error-Stubs |
Fazit
Java 9 macht CompletableFuture produktionsreifer für resiliente, timeout-basierte Architekturen und ermöglicht saubere Erweiterung via Vererbung.
Java
- Sechs Schlüsselinnovationen steigern die Leistung kryptografischer Hardware
- Robuste Temperatur- & Sensor-API auf Raspberry Pi mit GY-91 Modul bauen
- Blueprint zur Steigerung der Anlagenzuverlässigkeit: Strukturierter 5-Schritte-Plan
- Allegheny Power investiert 156 Mio. $ in Zuverlässigkeits-Upgrades in West Virginia
- CMMS-Funktionalität mit robuster API erweitern
- Java 9 (JDK 9): Wichtigste Features & Vorteile – Modularität, JShell, HTTP/2 & mehr
- Java 9 Process API Verbesserungen: ProcessHandle, Info & asynchrone Events
- Java 9 Stream API Erweiterungen: takeWhile, dropWhile, iterate & ofNullable
- Java 9 Optional Erweiterungen: stream(), ifPresentOrElse() & or()
- Java 9 Multi-Resolution Image API: Responsive Grafiken mit mehreren Auflösungen