Понимание собственных потоков Java и JVM - PullRequest
26 голосов
/ 16 апреля 2010

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

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

Ответы [ 4 ]

29 голосов
/ 16 апреля 2010

Каждый поток создает свой собственный экземпляр 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 может реализовывать периодическое вытеснение потоков, так что поток с интенсивным использованием процессора не монополизирует (одно) ядро, исключая другие потоки

7 голосов
/ 16 апреля 2010

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

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

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

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

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

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

5 голосов
/ 25 мая 2011

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

1 голос
/ 16 апреля 2010

Потоки Java отображаются на собственные потоки ОС. Они имеют мало общего с самой JVM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...