Что такое виртуальные потоки (Virtual Threads) в Java?

Ответ

Виртуальные потоки (Virtual Threads) — это легковесные потоки, реализованные в Java 19+ (JEP 425) как часть Project Loom. Они предназначены для эффективного выполнения задач, связанных с блокировками (например, ввод-вывод), а не с вычислениями.

Ключевые отличия от платформенных потоков (Platform Threads): Аспект Платформенный поток (классический) Виртуальный поток
Ресурсы Обертывает поток ОС (pthread в Linux). Дорогой в создании и переключении контекста. Легковесный объект в куче JVM. Дешевый в создании (миллионы).
Модель 1:1 (один поток JVM = один поток ОС). M:N (много виртуальных потоков планируются на меньшем числе потоков ОС).
Блокировка Блокирует драгоценный поток ОС. При блокировке (например, на I/O) виртуальный поток "открепляется" от потока-носителя, который может выполнять другую задачу.

Создание и использование:

// Java 21+ (Virtual Threads стали стабильной функцией)
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    // Запуск 10_000 легковесных задач
    IntStream.range(0, 10_000).forEach(i -> {
        executor.submit(() -> {
            Thread.sleep(Duration.ofSeconds(1)); // Виртуальный поток освобождает носитель на время сна
            return i;
        });
    });
} // executor.close() ожидает завершения всех задач

// Явное создание виртуального потока
Thread virtualThread = Thread.ofVirtual()
        .name("my-vthread-", 0)
        .start(() -> System.out.println("Hello from virtual thread"));
virtualThread.join();

Основная цель: Упростить параллельное программирование, позволяя писать синхронный, блокирующий код (легкий для понимания и отладки), который при этом масштабируется до десятков тысяч одновременных операций, как асинхронный код на CompletableFuture или реактивных стримах.

Ответ 18+ 🔞

А, виртуальные потоки в Java, ёпта! Ну это же просто праздник какой-то, блядь! Сидишь ты такой, пишешь свой сервак, и понимаешь, что на каждое подключение юзера надо городить отдельный поток, а их, этих юзеров, овердохуища! А классические потоки — это ж как танки, блядь: каждый требует целый поток операционки, ресурсов — просто пиздец!

И тут выкатывают они, сука, виртуальные потоки (Virtual Threads). Это как если бы вместо танка тебе дали миллион десантников-невидимок, которые весят как пушинка. Создал, выбросил — и не жалко, блядь!

Смотри, в чём прикол, на примере стола:

Что сравниваем Платформенный поток (старый, жирный) Виртуальный поток (новый, шустрый)
Что внутри Напрямую обёртка вокруг потока ОС (pthread там всякий). Создать — целая история, переключить — ещё та песня. Просто объект в памяти JVM, хитрая жопа. Создать — раз плюнуть, хоть миллион штук.
Как работает Один к одному: один твой поток Java = один поток в системе. Дорого, блядь! Много к немногим: куча твоих виртуальных потоков катаются на горстке настоящих потоков-носителей. Хуй с горы!
Что при блокировке Заснул на I/O — и твой драгоценный поток ОС тоже тупо спит, простаивает, блядь! Деньги на ветер! Заблокировался — виртуальный поток аккуратненько отлипает от носителя, а тот носитель идёт выполнять другую задачу. Красота, ёпта!

А теперь смотри, как это выглядит в коде, сука:

// Java 21+, там это уже стабильно, не какая-то экспериментальная хуйня
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    // Запускаем 10 тысяч задач, и ни одна ОС не заплачет!
    IntStream.range(0, 10_000).forEach(i -> {
        executor.submit(() -> {
            Thread.sleep(Duration.ofSeconds(1)); // Спи, не стесняйся! Носитель в это время другую работу делает!
            return i;
        });
    });
} // Тут всё само закроется и подождёт

// Или вот так, в лоб, создать виртуального солдата:
Thread virtualThread = Thread.ofVirtual()
        .name("my-vthread-", 0)
        .start(() -> System.out.println("Привет из виртуальной реальности, блядь!"));
virtualThread.join();

А смысл-то в чём, блядь? А смысл в том, чтобы не ебать себе мозг асинхронным адом с CompletableFuture и реактивными стримами, где можно запросто вывихнуть мозг. Пиши обычный, понятный, блокирующий код, как деды писали, а масштабироваться он будет, как сумасшедший, на десятки тысяч операций одновременно. Вот это я понимаю — прогресс, в рот меня чих-пых!