Middle+
246
questionbank

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

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

"Зелёные потоки" (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)