Concurrency Zaawansowany

Zarządzaj czasami życia współbieżnych zadań jako jedną jednostką pracy.

✕ Java 8
ExecutorService exec =
    Executors.newFixedThreadPool(2);
Future<User> u = exec.submit(this::fetchUser);
Future<Order> o = exec.submit(this::fetchOrder);
try {
    return combine(u.get(), o.get());
} finally { exec.shutdown(); }
✓ Java 25 (Preview)
try (var scope = new StructuredTaskScope
        .ShutdownOnFailure()) {
    var u = scope.fork(this::fetchUser);
    var o = scope.fork(this::fetchOrder);
    scope.join().throwIfFailed();
    return combine(u.get(), o.get());
}
Widzisz problem z tym kodem? Daj nam znać.
🛡️

Bez wycieków wątków

Wszystkie rozwidlone zadania kończą się przed zamknięciem zasięgu.

Szybkie wykrywanie błędów

ShutdownOnFailure anuluje rodzeństwo przy awarii jednego zadania.

📐

Przejrzysta struktura

Czas życia zadania odpowiada leksykalnemu zasięgowi w kodzie.

Stare podejście
Ręczny cykl życia wątków
Nowoczesne podejście
StructuredTaskScope
Od JDK
25
Poziom trudności
Zaawansowany
Ustrukturyzowana współbieżność
Preview

Podgląd w JDK 25 (piąty podgląd, JEP 505). Wymaga --enable-preview

Ustrukturyzowana współbieżność traktuje grupę współbieżnych zadań jako jedną operację. Jeśli któreś podzadanie zakończy się błędem, pozostałe są anulowane. Zasięg gwarantuje brak wycieków wątków i zapewnia jasne relacje rodzic-dziecko.