Virtual Threads, Thread Pools und Blocking IO

Virtual Threads sinnvoll einsetzen, klassische Pools verstehen und Blocking/Nonblocking sauber unterscheiden.

Virtual ThreadsThread PoolsJava 25Concurrency
Virtual Threads, Thread Pools und Blocking IO
Virtual Threads, Thread Pools und Blocking IO

Grundregel

Virtual Threads machen blockierenden Code skalierbarer, aber sie vergrößern nicht automatisch Datenbankpools, Broker-Limits oder Remote-System-Kapazität.

Typischer Fehler

Ein Team erhöht parallele Requests massiv, aber lässt den DB-Pool bei 20 Verbindungen. Ergebnis: Warteschlangen wandern nur an eine andere Stelle.

Beispiel

Virtual Threads mit externer Begrenzung
try (var executor = java.util.concurrent.Executors.newVirtualThreadPerTaskExecutor()) {
    var futures = customerIds.stream()
        .map(id -> executor.submit(() -> customerClient.loadCustomer(id)))
        .toList();
    for (var future : futures) {
        handle(future.get());
    }
}
// Wichtig: Remote-Limits, Timeouts und Bulkheads bleiben erforderlich.

Praxisübertragung auf das V4-Beispielprojekt

Entscheidung

Dokumentiere die getroffene Architekturentscheidung als ADR, inklusive Alternativen, Folgen und Betriebsrisiken.

Code-Nachweis

Markiere verwendete Entwurfsmuster direkt im Code und ergänze sie in docs/design-patterns.md.

Betrieb

Definiere Metrik, Alert, Runbook-Schritt und Rollback-Option für diesen Bereich.

Typische Fehlerbilder

  • Framework-Feature wird eingesetzt, ohne fachliche Grenze zu verstehen.
  • Technische Wiederholung wird nicht idempotent gemacht.
  • Observability wird erst nach Produktionsproblem ergänzt.
  • Tests prüfen nur Happy Path und keine Wiederanläufe.
⌂ Cockpit