0Pricing
Java Academy · Урок

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

Лёгкие потоки в Java 21

«Что такое виртуальные потоки» — бесплатный урок Java Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Добро пожаловать в мир виртуальных потоков

Виртуальные потоки стали полноценной возможностью в Java 21 (JEP 444). Это лёгкие потоки, которыми управляет JVM, а не операционная система.

Цель проста: позволить Вам писать понятный код по схеме поток на запрос, сохраняя возможность масштабирования до миллионов параллельных задач.

Старая проблема

Традиционный поток платформы соответствует одному потоку OS. Каждый такой поток занимает около мегабайта стека и дорого обходится при создании.

Поэтому одновременно можно выполнять лишь несколько тысяч потоков. Блокирующий ввод-вывод занимает целый поток OS, пока тот ожидает.

Отличия виртуальных потоков

Виртуальный поток не владеет потоком OS. Множество виртуальных потоков мультиплексируется на небольшой пул потоков платформы — потоков-носителей.

  • Дёшевы в создании (тысячи за миллисекунду)
  • Занимают очень мало памяти
  • Блокировка просто приостанавливает виртуальный поток, освобождая поток-носитель

Подключение и отключение

Когда виртуальный поток выполняется, он подключается к потоку-носителю. При блокирующей операции он отключается, освобождая поток-носитель для выполнения другой работы.

Приостановка и возобновление происходят автоматически. Ваш код выглядит как обычный блокирующий код.

Первый виртуальный поток

Вот самый простой возможный пример. Thread.ofVirtual().start(...) запускает виртуальный поток, а join() ожидает его завершения.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread vt = Thread.ofVirtual().start(() ->
            System.out.println("Hello from a virtual thread!"));
        vt.join();
        System.out.println("Main is done.");
    }
}

Проверка, что поток виртуальный

Каждый объект Thread предоставляет метод isVirtual(). Это позволяет проверить, на каком типе потока выполняется Ваш код.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread vt = Thread.ofVirtual().start(() -> {
            System.out.println("isVirtual: " + Thread.currentThread().isVirtual());
        });
        vt.join();
    }
}

Масштабирование до множества задач

Поскольку виртуальные потоки дёшевы, запуск десятков тысяч потоков — совершенно обычная практика. Здесь мы запускаем 10 000 таких потоков.

import java.util.concurrent.atomic.AtomicInteger;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        AtomicInteger counter = new AtomicInteger();
        Thread[] threads = new Thread[10_000];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = Thread.ofVirtual().start(counter::incrementAndGet);
        }
        for (Thread t : threads) t.join();
        System.out.println("Completed: " + counter.get());
    }
}

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

Для упрощения отладки виртуальному потоку можно задать имя с помощью построителя до его запуска.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread vt = Thread.ofVirtual()
                .name("worker-1")
                .start(() ->
                    System.out.println("Running on: " + Thread.currentThread().getName()));
        vt.join();
    }
}

Тот же интерфейс, новый механизм

Виртуальные потоки реализуют тот же интерфейс Thread, который Вы уже знаете. Вы по-прежнему используете start, join, sleep и interrupt.

Это означает, что существующие библиотеки, созданные на основе Thread и Runnable, работают без изменений.

Когда их использовать

Виртуальные потоки особенно хорошо подходят для задач, связанных с вводом-выводом: веб-серверов, обращений к базам данных и запросов к удалённым API.

Для вычислительных задач, требующих активной работы CPU, они не становятся быстрее. Здесь вы по-прежнему ограничены количеством ядер.

Это не пул

Важная смена представления: виртуальные потоки не объединяют в пул. Создавайте новый поток для каждой задачи и позволяйте ему завершаться после выполнения задачи.

Пулы нужны для повторного использования дорогостоящих ресурсов. Виртуальные потоки дёшевы, поэтому объединять их в пул — антипаттерн.

Быстрая проверка

Проверьте, насколько хорошо вы поняли принцип работы виртуальных потоков.

Итоги

Вы узнали, что такое виртуальные потоки и почему они важны:

  • Лёгкие, управляемые JVM, окончательно реализованные в Java 21
  • Мультиплексируются на потоки-носители посредством монтирования и демонтирования
  • Идеальны для высококонкурентной работы, связанной с вводом-выводом
  • Тот же интерфейс Thread, но потоки создаются для каждой задачи, а не берутся из пула

Далее вы узнаете о разных способах их создания.

Часто задаваемые вопросы

Урок «Что такое виртуальные потоки» бесплатный?

Да — полный текст урока «Что такое виртуальные потоки» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Что такое виртуальные потоки»?

Лёгкие потоки в Java 21 Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

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

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Что такое виртуальные потоки
  2. Создание виртуальных потоков
  3. Платформенные и виртуальные потоки
  4. Ошибки: закрепление и ThreadLocals
← Назад к Java Academy