JDK 28 получил стабильный API структурированного параллелизма

Изображение: OpenAI
В JDK 28 API StructuredTaskScope для структурированного параллелизма стал стабильным без изменений по сравнению с последней предварительной версией в JDK 27, сообщает InfoQ. Разработчики библиотек и фреймворков смогут использовать его, не требуя от пользователей включать предварительные возможности Java.
API прошёл семь предварительных версий; это самый долгий такой цикл среди возможностей Project Loom. Релиз JDK 28 запланирован на март 2027 года.
StructuredTaskScope из пакета java.util.concurrent объединяет связанные подзадачи в одну группу. По умолчанию они работают в виртуальных потоках, а сбой одной отменяет остальные. При закрытии области выполнения API отменяет незавершённые подзадачи и ждёт завершения их потоков. Обычные ExecutorService и Future таких гарантий не дают: родительский метод может вернуть результат, пока подзадачи продолжают работать в фоне.
При одновременном сбое нескольких подзадач API не гарантирует, какую из ошибок получит вызывающий код. Документация обещает лишь, что исключение будет связано с одной из подзадач, завершившихся с ошибкой.
Для кода, который уже использует API из JDK 27, переход сводится к удалению --enable-preview из настроек компилятора, запуска тестов и скриптов запуска и пересборке проекта на сборке раннего доступа JDK 28, где это изменение уже есть. Менять код под новый API не требуется. Тем, кто переходит с JDK 26, правок больше: FailedException заменён на ExecutionException, в сигнатуры собственных Joiner добавлен параметр типа R_X, класс StructuredTaskScope.TimeoutException удалён (истечение срока теперь видно по причине исключения CancelledByTimeoutException), метода Joiner.awaitAll() больше нет, а обратный вызов onTimeout() заменён абстрактным методом timeout().



