Подтвердить что ты не робот

Понимание родных потоков java и jvm

Я понимаю, что jvm - это приложение, которое превращает байт-код исполняемого файла java в собственный машинный код, но при использовании собственных потоков у меня есть некоторые вопросы, на которые я просто не могу ответить.

  • Создает ли каждый поток свои собственные экземпляр jvm для обработки их конкретное исполнение?
  • Если нет, то у jvm должен быть какой-то способ запланировать, какой поток он будет обрабатывать следующим образом, если это так не приведет к многопоточной природе java бесполезно, поскольку только один поток может запускаться за один раз?
4b9b3361

Ответ 1

Каждый поток создает свой собственный экземпляр 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); см. fooobar.com/questions/1159114/....

Но даже с чистыми зелеными нитями вы все равно получаете параллелизм. Управление переключается на другие потоки, которые блокирует поток при операции ввода-вывода, когда блокировка получается, и так далее. Кроме того, среда выполнения JVM может реализовывать периодическое вытеснение потоков, так что поток, интенсивно использующий ЦП, не монополизирует (одно) ядро, исключая другие потоки.

Ответ 2

Создает ли каждый поток свой собственный экземпляр jvm для обработки их конкретного выполнения?

Нет, ваше приложение, запущенное в JVM, может иметь много потоков, которые все существуют в этом экземпляре JVM.

Если нет, то у jvm должен быть какой-то способ запланировать, какой поток он будет обрабатывать далее...

Да, JVM имеет планировщик потоков. Существует множество различных алгоритмов планирования потоков, и один из них зависит от JVM-поставщика. (Scheduling в целом интересная тема.)

... если бы это не привело бы к многопоточной природе java бесполезно, поскольку только один поток может запускаться за раз?

Я не уверен, что понимаю эту часть вашего вопроса. Это своего рода точка нарезания резьбы. Обычно у вас больше потоков, чем у процессоров, и вы хотите запускать несколько штук одновременно. Threading позволяет полностью использовать преимущества вашего процессора, убедившись, что он занят обработкой одного потока, в то время как другой ожидает ввода-вывода или по какой-то другой причине не занят.

Ответ 3

Java-поток может отображаться один-к-одному в поток ядра. Но это не должно быть так. Могут быть n потоков ядра, выполняющих m java threads, где m может быть намного больше n, а n должно быть больше числа процессоров. Сама JVM запускает n потоков ядра, и каждый из них выбирает поток java и запускает его некоторое время, а затем переключается на другой поток java. Операционная система выбирает потоки ядра и назначает их процессору. Таким образом, планирование потоков может выполняться на нескольких уровнях. Вам может быть интересно посмотреть на язык программирования GO, где тысячи так называемых "Goroutines" работают десятками потоков.

Ответ 4

Java-потоки сопоставляются с потоками ОС. Они имеют мало общего с самим JVM.