🧵 Виртуальные потоки: Революция производительности
Представьте, что вы строите высоконагруженный сервер. Раньше у вас было два пути:
1. Классика (
2. Асинхронность (WebFlux/Netty): Сервер держит 100k соединений, но код превращается в лапшу из
В Java 21 появились Виртуальные потоки. Они объединяют простоту первого подхода и производительность второго.
🪶 В чем магия?
Классический поток Java (
Виртуальный поток, это просто объект в куче (heap) JVM. Он не привязан к ОС намертво.
🔴 Вес: Несколько килобайт (вместо мегабайт).
🔴 Количество: Можно создать миллион виртуальных потоков на обычном ноутбуке.
⚙️ Как это работает (Carrier Threads)
Под капотом работает схема Mount/Unmount:
1. JVM запускает небольшой пул обычных потоков ОС (называются Carrier Threads, обычно их число = числу ядер CPU).
2. Ваш виртуальный поток "садится верхом" на Carrier-поток и выполняет код.
3. ⚠️ Самое важное: Как только ваш код блокируется (ждет ответа от БД, читает файл, делает
4. Поток ОС освобождается и тут же берет в работу другой виртуальный поток.
Итог: Ядра процессора молотят на 100%, никогда не простаивая в ожидании ввода-вывода.
💻 Код: Найди 1 отличие
API практически не изменился. Вам не нужно учить новые фреймворки.
⚰️ Конец Reactive Programming?
Многие эксперты говорят: Да.
Смысл использования сложных реактивных библиотек (RxJava, Reactor) был в том, чтобы не блокировать потоки. Виртуальные потоки делают блокировку дешевой.
Теперь вы можете писать простой, последовательный код:
...и он будет работать так же эффективно, как сложный асинхронный код.
⚠️ Когда НЕ использовать?
Виртуальные потоки идеальны для I/O задач (ждать сеть, ждать диск).
Они бесполезны для CPU-Intensive задач (майнинг, шифрование, обработка видео). Если поток не ждет, а считает, он занимает поток ОС, и виртуалка тут не поможет.
🔥 Итог
Project Loom вернул нам девиз: "Один запрос - Один поток".
Больше никаких пулов потоков с ограниченным размером. Просто создавайте новый виртуальный поток для каждой задачи.
#Java #Loom #VirtualThreads #Concurrency #HighLoad
📲 Мы в MAX
👉@BookJava
Представьте, что вы строите высоконагруженный сервер. Раньше у вас было два пути:
1. Классика (
Thread): Простой код, но один поток весит ~2 Мб памяти. Создадите 5,000 потоков - сервер упадет с OutOfMemoryError.2. Асинхронность (WebFlux/Netty): Сервер держит 100k соединений, но код превращается в лапшу из
callbacks и CompletableFuture, которую невозможно отлаживать.В Java 21 появились Виртуальные потоки. Они объединяют простоту первого подхода и производительность второго.
🪶 В чем магия?
Классический поток Java (
Platform Thread) привязан 1-к-1 к потоку операционной системы (OS Thread). Это дорогой ресурс.Виртуальный поток, это просто объект в куче (heap) JVM. Он не привязан к ОС намертво.
⚙️ Как это работает (Carrier Threads)
Под капотом работает схема Mount/Unmount:
1. JVM запускает небольшой пул обычных потоков ОС (называются Carrier Threads, обычно их число = числу ядер CPU).
2. Ваш виртуальный поток "садится верхом" на Carrier-поток и выполняет код.
3. ⚠️ Самое важное: Как только ваш код блокируется (ждет ответа от БД, читает файл, делает
Thread.sleep), JVM снимает виртуальный поток с ядра.4. Поток ОС освобождается и тут же берет в работу другой виртуальный поток.
Итог: Ядра процессора молотят на 100%, никогда не простаивая в ожидании ввода-вывода.
💻 Код: Найди 1 отличие
API практически не изменился. Вам не нужно учить новые фреймворки.
// Старый способ (Тяжелый поток ОС)
Thread.ofPlatform().start(() -> {
System.out.println("Я ем много памяти!");
});
// Новый способ (Легкий виртуальный поток)
Thread.ofVirtual().start(() -> {
System.out.println("Я ничего не вешу!");
});
// Использование с ExecutorService (для старого кода)
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 1_000_000).forEach(i -> {
executor.submit(() -> {
Thread.sleep(1000); // Блокировка теперь БЕСПЛАТНАЯ
return i;
});
});
}
// Этот код запустит миллион задач за секунду, не положив сервер.
⚰️ Конец Reactive Programming?
Многие эксперты говорят: Да.
Смысл использования сложных реактивных библиотек (RxJava, Reactor) был в том, чтобы не блокировать потоки. Виртуальные потоки делают блокировку дешевой.
Теперь вы можете писать простой, последовательный код:
var user = db.findUser();var data = http.sendRequest(user);...и он будет работать так же эффективно, как сложный асинхронный код.
⚠️ Когда НЕ использовать?
Виртуальные потоки идеальны для I/O задач (ждать сеть, ждать диск).
Они бесполезны для CPU-Intensive задач (майнинг, шифрование, обработка видео). Если поток не ждет, а считает, он занимает поток ОС, и виртуалка тут не поможет.
🔥 Итог
Project Loom вернул нам девиз: "Один запрос - Один поток".
Больше никаких пулов потоков с ограниченным размером. Просто создавайте новый виртуальный поток для каждой задачи.
#Java #Loom #VirtualThreads #Concurrency #HighLoad
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤1