Количество платформенных потоков ограничено количеством потоков ОС. Есть ThreadLocal. Они подходят для выполнения любых задач. Но они ограничены по ресурсам, и чтобы они заканчивались нужно заморочится.
Виртуальный поток не привязан к конкретному потоку ОС. При вызове блокирующей операции Java останавливает этот поток, до момента пока его можно будет вызвать. То есть мы освобождаем настоящий поток ОС, чтобы он не простаивал.
В виртуальных потоках не рекомендуется использовать ThreadLocal.
Подходят для выполнения задач, которые часто находятся в состоянии блокировки. Не подходят для выполнения длительных вычислений и систем в реальном времени.
![](screen%2031.png)![](screen%2032.png)
В Quarkus есть аннотация для запуска на виртуальных потоках @RunOnVirtualThread
![](screen%2033.png)
Пока ресурсов железа хватает никакой разницы нет. Когда железо заканчивается, то виртуальные треды начинают отрабатывать быстрее (раза в 2-3).