Виртуальный поток Java 19 — стоит ли его использовать?

Feb 16 2023
Этот блог является первой частью серии из двух частей, в которой объясняется, что такое виртуальные потоки в Java 19, как виртуальные потоки могут повысить производительность приложений, и, наконец, некоторые бенчмарки с использованием виртуальных потоков. Что такое виртуальные потоки: Поскольку ChatGPT — это новый Google, давайте спросим его об определении «Виртуальные потоки в Java19» (он каждый раз давал разные и осмысленные определения, респект создателям этой красоты!!!) Виртуальные потоки — это тип облегченных потоков в Java 19.

Этот блог является первой частью серии из двух частей, в которой объясняется, что такое виртуальные потоки в Java 19 , как виртуальные потоки могут повысить производительность приложений и, наконец, проводится бенчмаркинг с использованием виртуальных потоков.

Что такое виртуальные потоки:

Так как ChatGPT — это новый Google , давайте спросим его об определении «Виртуальные потоки в Java19» (он каждый раз давал разные и осмысленные определения, респект создателям этой красоты!!!)

Виртуальные потоки — это тип облегченных потоков в Java 19. Виртуальные потоки позволяют пользователям создавать большое количество потоков, не испытывая накладных расходов, связанных с традиционными потоками. Виртуальные потоки управляются виртуальной машиной Java, поэтому их можно повторно использовать по мере необходимости и обеспечить существенное повышение производительности по сравнению с использованием традиционных собственных потоков.

Для любителей GoLang виртуальные треды для рутины — не что иное , как «Брат от другой матери».

Чем полезны виртуальные потоки

Виртуальные потоки Java отличаются от исходных потоков платформы в том смысле, что виртуальные потоки намного легче с точки зрения того, сколько ресурсов (ОЗУ) они требуют от системы для выполнения . Таким образом, в ваших приложениях может быть запущено гораздо больше виртуальных потоков, чем потоков платформы. Все это время дает вам все преимущества обычного потока платформы.

Использование виртуальных потоков

Создание виртуального потока в java похоже на создание обычного потока Runnable. Однако мы будем использовать класс Executors для создания newVirtualThreadPerTaskExecutor (), который запускает новый виртуальный поток для каждой задачи. Количество потоков, создаваемых Исполнителем, не ограничено.

Тест

В этом тесте я буду вызывать внешнюю службу (на ответ которой требуется 1 миллисекунда) и выполнять операцию 1 миллион раз, используя как обычную платформу, так и виртуальные потоки.

Цель:
сравнить время, затрачиваемое виртуальными потоками и обычными потоками на выполнение операции 1 миллион раз.
Характеристики машины: 10 ядер, 16 ГБ памяти.

Код :

Обычные резьбы

Я мог использовать максимум до 1000 потоков и получал ошибку OOM.

Виртуальные потоки

Полученные результаты :

Ниже показано использование ЦП + время, затраченное обоими подходами на запуск внешнего цикла for 10 раз.

Обычные резьбы

Увеличить, чтобы увидеть

Виртуальные потоки

Увеличить, чтобы увидеть

Заключение :

Разница во времени между использованием обычных и виртуальных потоков в черно-белом режиме дает нам явного победителя в использовании виртуальных потоков на случай, если мы ждем какой-либо внешней службы. Если мы экстраполируем этот пример на 10 миллионов или 100 миллионов вызовов, разница становится значительно больше, и виртуальные потоки становятся более эффективными, когда приложение вовлечено в ожидание какого-то внешнего приложения.

В примере имитируется вызов внешней службы с помощью Thread.sleep(), который можно заменить фактическим вызовом внешней службы. Это оставлено читателю в качестве упражнения. СДЕЛАЙ ЭТО!!!

ПРИМЕЧАНИЕ. Это правда, что методом проб и ошибок мы можем оптимизировать количество создаваемых обычных потоков, хотя невозможно предсказать идеальное количество потоков для каждого варианта использования (если вы случайным образом сохраняете пул с более высокими потоками). , вы зря тратите ресурсы приложения). Использование динамического выделения потоков (виртуальных потоков) имеет гораздо больше смысла в реальном приложении.

Проблемы с использованием виртуальных потоков

Приведенный выше пример только что заставил вас понять, что виртуальные потоки — это горячая сделка, и для ускорения ваших приложений и для оптимального использования вашего ЦП мы всегда должны создавать виртуальные потоки.

Лишь бы не было « НО ».

Виртуальные потоки в Java великолепны, но в случае, если ваше приложение не привязано к вводу-выводу, т. е. если самому ЦП необходимо выполнить некоторую тяжелую обработку (например, обучение модели или подсчет до 100 миллионов), использование виртуальных потоков не является идеальным выбором.

Подробности об этом будут даны во 2-й части данной статьи. Следите за обновлениями!!!

Последние мысли

Внедрение Java 19 для систем все еще находится на стадии разработки (поскольку проект Loom пока находится только на этапе предварительного просмотра), хотя мы ожидаем увидеть огромные улучшения в управлении сервером, более быстрое время отклика API и менее частые проблемы с OOM.

Об авторе :

Яш Бансал — заместитель главного инженера RedBus. Более подробную информацию о нем можно найти в его профиле на LinkedIn .