Каждый поток создает свой собственный экземпляр JVM для обработки своего конкретного выполнения?
Нет. Они выполняются в одной JVM, чтобы (например) они могли совместно использовать объекты и атрибуты класса.
Если нет, то JVM должен каким-то образом планировать, какой поток он будет обрабатывать следующим
Существует два вида реализации потоков в Java. Собственные потоки отображаются на абстракцию потока, которая реализуется хост-ОС. ОС заботится о собственном планировании потоков и распределении времени.
Второй вид нити - «зеленые нити». Они реализуются и управляются самой JVM, а JVM реализует планирование потоков. Внедрения зеленых потоков Java не поддерживаются JVM Sun / Oracle начиная с Java 1.2. (См. Зеленые нити против не зеленых нитей )
Если это так, не сделает ли это многопоточную природу Java бесполезной, поскольку одновременно может быть запущен только один поток?
Мы сейчас говорим о зеленых нитях, и это представляет исторический интерес (только) с точки зрения Java.
Преимущество зеленых потоков заключается в том, что планирование и переключение контекста выполняются быстрее в случае, когда не требуется ввод-вывод. (На основе измерений, выполненных с помощью Java в Linux 2.2; http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.8.9238)
При чисто зеленых потоках N потоков языка программирования отображаются в один собственный поток. В этой модели вы не получите истинного параллельного выполнения, как вы заметили.
В реализации гибридного потока N потоков языка программирования отображаются на M собственных потоков (где N> M). В этой модели внутрипроцессный планировщик потоков отвечает за планирование «зеленого» потока к собственному потоку И вы получаете истинное параллельное выполнение (если M> 1); см https://stackoverflow.com/a/16965741/139985.
Но даже с чистыми зелеными нитями вы все равно получаете параллелизм. Управление переключается на другие потоки, которые блокирует поток при операции ввода-вывода, когда блокировка получается, и так далее. Кроме того, среда выполнения JVM может реализовывать периодическое вытеснение потоков, так что поток с интенсивным использованием процессора не монополизирует (одно) ядро, исключая другие потоки