"Зелёные потоки" (green threads) — это потоки, управление которыми осуществляется в пользовательском пространстве, а не на уровне операционной системы. Они не связаны с нативными потоками ОС.
Ключевые особенности:
Исторически "зелёные потоки" существовали в 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) |