В java 19 войдёт новый JEP в стадии "инкубатор" — Structured concurrency. В этом посте расскажу, зачем он нужен и какую проблему решает.
Многопоточка многих пугает своей сложностью. Но на самом деле java — очень дружелюбный язык, и новый JEP — отличный тому пример.
Как выполнить большую задачу быстрее? Разбить на подзадачи, отправить в экзекьютор и объединить результаты:
Future f1=executor.submit(…);Что будет, если в задаче для
Future f2=executor.submit(…);
…
return f1.get() + f2.get();
f1 выбросится исключение?👎 Мы узнаем об этом только при вызове
f1.get()
👎 Задача в f2 продолжит работу, хотя это бессмысленно. В лучшем случае она просто потратит процессорное времяТак как подзадачи логически не связаны между собой, программист должен добавить прерывания и механизмы отслеживания ошибок.
Новый JEP берёт часть забот на себя:
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
Future f1=scope.fork(…);
Future f2=scope.fork(…);
scope.join();
scope.throwIfFailed();
return f1.resultNow()+f2.resultNow();
}
Что происходит:▪️
scope.fork — задачи запускаются в едином логическом блоке▪️
scope.join — ждём завершения подзадач▪️
scope.throwIfFailed — пробрасываем исключение, если оно возникло в одной из подзадач. Другим методом можно получить экземпляр исключения и обработать его сразу▪️Забираем результаты через
resultNow и объединяемС первого взгляда всё то же самое. Но самое интересное происходит в первой строке, где определяются правила взаимодействия подзадач:
🔸
ShutdownOnFailure — если хотя бы одна подзадача выбросит исключение, остальные будут прерваны. Обработку прерывания всё ещё пишет разработчик, но java берёт на себя всю работу по отслеживанию и обновлению статусов🔸
ShutdownOnSuccess — когда хотя бы одна задача завершится, остальные прерываютсяБонус — JVM в курсе связей между задачами, поэтому в тред дампе подзадачи будут в древовидной структуре.
❓ Чем
ShutdownOnSuccess отличается от методов anyOf в экзекьюторах и CompletableFuture?В текущих вариантах при ошибке другие задачи не прерываются, в лучшем случае задачи удаляются из очереди
❓ Что классного в этом JEP?
Что по сути эта фича необязательна. Хоть кто-нибудь жаловался, что подзадачи в тред дампе не связаны? Что неудобно следить за исключениями в подзадачах?
Нет, никто не жаловался. Но разработчики java изучают сценарии использования языка и стараются облегчить жизнь пользователям❤️