Какой поток создается в операционной системе при создании обычного потока в Java?
Что проверяют
Понимаете ли вы модель потоков HotSpot: сколько стоит поток, кто его планирует и чем обычный поток отличается от виртуального. Следом почти наверняка спросят про виртуальные потоки из Java 21.
Как отвечать
Обычный, он же платформенный, поток в HotSpot отображается на поток ядра ОС один к одному. Зелёных потоков с планировщиком внутри JVM в HotSpot давно нет. Механика:
- момент создания:
new Thread(...)создаёт только Java-объект. Нативный поток появляется при вызовеstart(): на Linux черезpthread_create, который внутри вызываетclone, на Windows черезCreateThread; - планирование: потоком управляет планировщик ОС, а
Thread.setPriorityна Linux по умолчанию почти ни на что не влияет; - стек: у каждого потока свой стек, размер задаёт
-Xss(на 64-битном Linux по умолчанию 1 МБ). Память резервируется виртуально, но тысячи потоков заметно нагружают систему и добавляют переключений контекста; - как увидеть: в
jstackу потока есть полеnid, это идентификатор нативного потока в шестнадцатеричном виде. Тот же поток видно вtop -Hилиps -L.
Дальше сравните с виртуальными потоками (JEP 444, стабильны с Java 21). Thread.ofVirtual().start(...) или Executors.newVirtualThreadPerTaskExecutor() не создают поток ОС. Виртуальный поток исполняется на небольшом пуле потоков-носителей, по умолчанию это ForkJoinPool с числом потоков по ядрам. На блокирующем вводе-выводе он снимается с носителя, и носитель берёт другую задачу. В Java 24 (JEP 491) убрали прикрепление к носителю внутри synchronized.
Итог: платформенный поток дорогой и подходит для вычислений и небольшого числа долгих задач, виртуальный дешёвый и подходит для тысяч задач, которые в основном ждут.
Где спотыкаются
Говорят, что поток ОС создаётся в конструкторе Thread. До start() его нет, а вызов run() вообще выполнит код в текущем потоке.
Отвечают «пользовательский или системный, зависит от ОС». Для HotSpot на всех основных платформах ответ однозначный: поток ядра, модель 1:1.
Считают виртуальные потоки ускорителем вычислений. Для CPU-задач они ничего не дают, их выигрыш в ожидании ввода-вывода.