Что такое 'зелёные потоки' и существуют ли они в 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) |