Назад к вопросам
Middle+
467
questionbank

Что такое 'зелёные потоки' и существуют ли они в Java?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

"Зелёные потоки" (green threads) — это потоки, управление которыми осуществляется в пользовательском пространстве, а не на уровне операционной системы. Они не связаны с нативными потоками ОС.

Ключевые особенности:

  • Управление: Полностью управляются виртуальной машиной Java (JVM), без участия планировщика ОС.
  • Накладные расходы: Создание и переключение между ними быстрее и требует меньше ресурсов, чем у нативных потоков, поскольку нет необходимости в системных вызовах.
  • Масштабируемость: Масштабируются лучше с точки зрения количества потоков, так как потребляют меньше памяти и ресурсов ядра ОС.
  • Параллелизм: Не могут выполнять код параллельно на многопроцессорных системах, так как все "зелёные потоки" мапятся на один нативный поток ОС. В каждый момент времени выполняется только один "зелёный поток" на данном нативном потоке. Если один "зелёный поток" блокируется (например, ждет I/O), это блокирует и нативный поток, на котором он запущен, останавливая выполнение других "зелёных потоков" на этом же нативном потоке.

Исторически "зелёные потоки" существовали в Java, в частности, в старых версиях JVM (примерно до Java 1.2). Sun Microsystems использовала их для обеспечения переносимости на платформы, где нативные потоки были плохо реализованы или вовсе отсутствовали.

В современных версиях Java (начиная с Java 1.2 и далее) потоки JVM являются нативными потоками (native threads), маппирующимися на потоки операционной системы (1:1 модель: каждый поток JVM соответствует одному потоку ОС). Это позволяет JVM использовать планировщик ОС и выполнять потоки параллельно на многопроцессорных системах.

Таким образом, в современной Java "зелёные потоки" в их первоначальном смысле не существуют. JVM использует нативные потоки операционной системы для реализации многопоточности.

Однако, концепция легковесных, управляемых средой исполнения "потоков" или "задач", которые не мапятся напрямую на потоки ОС, возвращается с Project Loom. Project Loom вводит виртуальные потоки (virtual threads). Виртуальные потоки похожи на "зелёные потоки" в том смысле, что они являются легковесными, управляемыми JVM, и можно создавать миллионы таких потоков. Но главное отличие от старых "зелёных потоков" заключается в том, что виртуальные потоки мапятся на пул потоков-носителей (carrier threads) (которые являются нативными потоками ОС). Когда виртуальный поток блокируется (например, при I/O операции), среда выполнения Loom может "размонтировать" его с потока-носителя и позволить другому виртуальному потоку выполнять код на этом же потоке-носителе. Это обеспечивает масштабируемость и позволяет эффективно использовать ресурсы, при этом сохраняя возможность выполнения кода на многопроцессорных системах через пул нативных потоков-носителей.

Сравнение:

Характеристика "Зелёные потоки" (историческая Java) Нативные потоки (современная Java) Виртуальные потоки (Project Loom)
Управление JVM (пользовательское пространство) Операционная система (ядро) JVM (пользовательское пространство)
Привязка к потокам ОС Многие к одному (M:1) Один к одному (1:1) Многие к пулу носителей (M:N)
Накладные расходы Низкие Высокие Очень низкие
Масштабируемость Высокая (по количеству) Ограниченная (по количеству) Очень высокая
Параллелизм Нет (на одном ядре) Есть (насколько позволяет ОС/железо) Есть (через пул носителей)
Блокирующие операции Блокируют JVM Блокируют поток ОС Не блокируют поток-носитель (как правило)
Существование в Java До Java 1.2 С Java 1.2 по настоящее время С Java 19 (preview), Java 21 (stable)