Структурированный параллелизм
Управление жизненным циклом параллельных задач как единой единицей работы.
Сравнение кода
✕ 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());
}
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Нет утечек потоков
Все разветвлённые задачи завершаются до закрытия Scope.
Быстрый сбой
ShutdownOnFailure отменяет дочерние задачи при сбое одной из них.
Чёткая структура
Жизненный цикл задач соответствует лексическому Scope в коде.
Старый подход
Ручное управление жизненным циклом потоков
Современный подход
StructuredTaskScope
Начиная с JDK
25
Сложность
Продвинутый
Поддержка JDK
Структурированный параллелизм
Предварительный просмотр
Preview в JDK 25 (пятое preview, JEP 505). Требует --enable-preview.
Как это работает
Структурированный параллелизм рассматривает группу параллельных задач как единую операцию. Если одна подзадача завершается с ошибкой, остальные отменяются. Scope гарантирует, что ни один поток не будет потерян, и создаёт чёткие отношения родитель-потомок.
Связанная документация
Доказательство