Project Loom. Асинхронная многопоточность в Java 15

preview_player
Показать описание
Project Loom: эффективная асинхронная многопоточность в Java 15. Реализация идеи Fibers (файберов) и Continuations (континуаций) - легковесных потоков в Java.

Поддержать проект:

Текущая реализация многопоточности в Java на момент выхода JDK 14 строится вокруг Threads - потоков (тредов) операционной системы. Данный подход не плох сам по себе, но имеет ряд существенных проблем при высокой нагрузке: во-первых экземпляр потока занимает достаточно много оперативной памяти, во-вторых, при большом количестве потоков процессор тратит много времени на переключение между ними, в третьих, при работе с медленными ресурсами (диск, сеть, БД), потоки могут блокироваться и впустую тратить время процессора (во время блокировки потока, процессор ничего не делает).
Для решения этой проблемы в Java вводятся различные сущности и абстракции. Самые яркие из них - ForkJoinPool и CompletableFuture, которые позволяют запускать задачи на выполнение в асинхронной манере без порождения лишних потоков на уровне операционной системы.
Следующий важный шаг - введение Fibers (файберы), Continuations (континуации) и yield (вытеснение). Эти сущности позволяют создавать легковесные потоки сотнями тысяч, без больших затрат оперативной памяти и процессорного времени на переключение контекста потоков на уровне ОС. В любой момент времени задача может вытеснить себя во время выполнения и освободить рабочий тред для другой задачи, повышая утилизацию процессора.

GitHub проекта Loom:

Мейллисты проекта Loom за март 2020:

Статья на хабре, с хорошим описанием того, как происходит вытеснение континуаций в файберах:

Черновики (весьма скудные) документации по проекту:

➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖

Рекомендации по теме
Комментарии
Автор

Очень хотелось бы узнать подробнее про ForkJoinPool

nvrstyles
Автор

Сделай про форк джоин пул, раз уж пошла такая тема.

andrewblack
Автор

Недавно попал на канал и сразу подписался. В джаве не новичок, но то о чем тут рассказывают, и главное как, заставляет отложить все и вникать))

MrDreamVan
Автор

Спасибо за видео. Есть несколько замечаний:
0:10 - немного преждевременный оптимизм по поводу выхода preview-версии JDK 15. Откуда взялась эта информация? Про это никто точно не писал ни в Wiki, ни в рассылке. То, что сборки Loom сейчас базируются на JDK 15, ничего не означает. И уж точно в JDK 17 не будет стабильной версии.
6:18 - всё-таки это не JDK 15, а Loom Early-Access Build, основанный на JDK 15.
6:40 - в IDEA есть комбинация кнопок Ctrl+Shift+Enter, которая автоматически вставит фигурные скобки и поставит курсор сразу на новую строку.
15:50 - не объяснено, что такое Это новый метод, который выполняет каждую задачу в новом потоке.
23:24 - нет, всё не происходит в одном потоке. Это разные потоки, просто у них одинаковые имена:) (из-за того, что вы явно прописали name в билдере).

И есть ещё общее замечание по поводу содержания. Очень важная фишка Loom - это возможность вызывать блокирующие network операции из виртуальных потоков, и эти операции не будет пинить реальные потоки и просаживать ресурсы. Для полноты можно было бы привести небольшой пример с каким-нибудь Socket.accept().

ZhekaKozlov
Автор

Миллениалы нашли файберы)) Годно.
*Кто исполняется не в виртуальных машинах - улыбнулись, я улыбался.

Я аж подписался. И колокольчик нажал.

beerbis
Автор

Опытный разработчик всегда посмотрит направо и налево, даже если переходит улицу с односторонним движением.))

andreyguzik
Автор

Почему ещё не было видео про ForkJoinPool? (Ирония)
Спасибо, как всегда пушка!!

intBRiNGER
Автор

Хотелось бы посмотреть в похожем ключе про Valhalla.

reality_sc
Автор

Давно пора было запилить корутины из Котлин на Джаву. Рад, что эта фитча уже в разработке.

GlebKuzntesov
Автор

22:22 Ух бля. Я уже предвкушаю баги от потерянного секьюрити контекста, например Спринга, из-за того, что исполнение началось в одном потом потоке, а закончилось в другом.

vitaliygoldish
Автор

По ходу в 15 джаву Loom не попал.
Поэтому - интересует отдельное видео про ForkJoinPool :)

revetastogne
Автор

все здорово и классно, у меня вопрос: сможешь показать пример многопоточности или ансихронyости в Javafx?

Hrachik
Автор

О нет, о нет, джаву поразил вирус ноды))

Krabaton
Автор

А чем это решение отличается от реактивного прогриммирования введеного в 9-ой версии? Там вроде так же, создаем ForkJoinPool с нужным количеством потоков (каждый поток/подписчик) работает ассинхронно, процессорные ресурсы размазываются равномерно и неполучится так что кто-то перегружет а кто-то ждет. К сожалению много в чем там еще не заробрался (с обратной связью request, на случай если подписчик непоспевает за источником а стек начинает переполнятся и лишние "публикации" пропадать).
Короче, если бы вам захотелось раскрыть эту тему то думаю что многим бы понравилось,

А так спасибо вам за интересный канал, где показана именно практика а не длинные нудные теории и где напирается ручками и с ошибками а не просто копипаст.

viktors.
Автор

По-моему, такой подход "ломает" ThreadLocal переменные. В спринге и не только на них, например, завязана транзакционность. Если перескочить не подумав то многие штуки сломаются. Или в loom'е есть совместимость по ThreadLocal?

alexrassvet
Автор

Нововведение выглядит как попытка покушения на эрланг =)
Из видео не понял вытесняется ли заблокированная на thread.sleep задача...

ХромовВладислав
Автор

Как происходит фиксация состония при вытеснении? Что будет с внушительным набором утилит, заточенных на работу с абстракциями потоков (семафоры, барьеры и тп)?

alexanderrozhdestvensky
Автор

Вышла 17-я Java LTS. Но проекта Loom в ней нет :-(

alexei
Автор

Простите за вопрос, сами мы не местные... async/await когда-нибудь будет? .NET, Python, JS, Rust, C++ - везде есть

Uni-Coder
Автор

Ого, джава возможно скоро сможет как Node.js

dimitriigoshev