Модель структурированного параллелизма
Рассматривайте связанные задачи как единое целое
«Модель структурированного параллелизма» — бесплатный урок Java Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Что такое структурированная конкурентность
Структурированная конкурентность (JEP 453, предварительная версия) рассматривает группу связанных конкурентных задач как единую единицу работы.
Если родительская задача разбивается на дочерние, все они должны завершиться до того, как родительская задача продолжит работу, подобно области действия блока в обычном коде.
Какую проблему это решает
При использовании обычных исполнителей запущенная задача может пережить создавшую её задачу, привести к утечке ресурсов или быть забытой. Ошибки в одной ветви могут остаться незамеченными, пока другие продолжают выполняться.
Это приводит к утечкам потоков, брошенным задачам и запутанной обработке сбоев.
Задачи как дерево
Структурированная конкурентность устанавливает связь между родителем и дочерними задачами. Дочерние задачи образуют дерево, корнем которого является запустившая их задача.
- Дочерняя задача не может пережить область действия родительской задачи
- Родитель ждёт завершения всех дочерних задач
- Отмена распространяется вниз по дереву
Отражение последовательного кода
Главная идея заключается в том, что конкурентный код должен выглядеть как последовательный. Область действия открывается, работа разветвляется, а область закрывается только после завершения всех задач.
Благодаря этому время жизни задач становится очевидным, а ошибки проще анализировать.
Старый неструктурированный подход
Вот знакомый, но неструктурированный подход с использованием обычного исполнителя. Он работает, но ничто не гарантирует, что две асинхронные операции имеют согласованное время жизни.
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) throws Exception {
try (ExecutorService exec = Executors.newVirtualThreadPerTaskExecutor()) {
Future<String> user = exec.submit(() -> "Ada");
Future<Integer> order = exec.submit(() -> 7);
System.out.println(user.get() + " has " + order.get() + " orders");
}
}
}Почему важна координация
В предыдущем примере, если получение данных пользователя завершается ошибкой, задача получения заказа продолжает бесполезно выполняться. Вам приходится вручную отменять её и обрабатывать исключения от каждого вызова get().
Структурированная конкурентность автоматизирует эту координацию.
Статус предварительной версии
Структурированная конкурентность доступна как экспериментальный интерфейс в пакете java.util.concurrent. Для её использования компилируйте и запускайте программу с параметром --enable-preview.
Центральный класс — StructuredTaskScope, который рассматривается в следующем уроке.
Гарантии времени жизни
Внутри структурированного scope:
- Все подзадачи завершаются, завершаются с ошибкой или отменяются до выхода из scope
- Ни одна подзадача не выполняется в фоновом режиме после выхода из scope
- Стек вызовов отражает настоящую иерархию задач в дампах потоков
Преимущество наблюдаемости
Поскольку дерево подзадач задано явно, инструменты JDK могут его отображать. Дамп потоков группирует подзадачи под их родительским scope, поэтому диагностика становится значительно понятнее, чем при разрозненных потоках пулов.
Хорошо сочетается с виртуальными потоками
Каждая подзадача в структурированном scope по умолчанию выполняется в собственном виртуальном потоке. Именно низкая стоимость виртуальных потоков делает практичным разветвление на множество подзадач.
Эти две возможности создавались для совместной работы.
Ментальная модель
Представляйте структурированный scope как блок try с ресурсами для параллелизма: Вы открываете его, создаёте подзадачи с помощью fork, вызываете join, а затем закрываете scope. Закрывающая фигурная скобка гарантирует, что ничего не продолжает выполняться.
Быстрая проверка
Проверьте, насколько хорошо Вы поняли основной принцип.
Итоги
Вы познакомились с моделью структурированного параллелизма:
- Связанные задачи образуют дерево, привязанное ко времени жизни scope
- Параллельный код читается как последовательный
- Это программный интерфейс предварительного просмотра, требующий
--enable-preview - Он естественным образом сочетается с виртуальными потоками
Далее: сам программный интерфейс StructuredTaskScope.
Часто задаваемые вопросы
Урок «Модель структурированного параллелизма» бесплатный?
Да — полный текст урока «Модель структурированного параллелизма» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Модель структурированного параллелизма»?
Рассматривайте связанные задачи как единое целое Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Модель структурированного параллелизма»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Модель структурированного параллелизма
- StructuredTaskScope
- Завершение при сбое и успехе
- Обработка ошибок и отмена