Как запланированы потоки Java? - PullRequest
4 голосов
/ 27 марта 2012

Я недавно начал многопоточное программирование с Java в случае потоков Linux я знаю, что ядро ​​планирует их (так как они являются единицами, которые запланированы), но Java-программы выполняются на JVM, которая в моей системе (RHEL 6.1) реализована как программа, которая запускается как пользователь Космический экземпляр. Итак, почему ядро ​​не знает о потоках Java, почему в JVM выполняется упреждающая многозадачность? будет полезно, если для этого будет дан весь механизм взаимодействия JVM и ядра.

Пожалуйста, укажите возможные источники информации

Ответы [ 4 ]

3 голосов
/ 27 марта 2012

Потоки в процессе java / JVM отображаются на собственный поток, и вы можете видеть как идентификатор потока java, так и идентификатор собственного потока в дампе трассировки стека потоков.Получите стек потоков всех потоков Java, используя ваш любимый инструмент:

  • сигнал командной строки, такой как ctrl + break (windows) или ctrl + \ linux) в консоли, где работает программа java
  • инструмент командной строки (kill -QUIT или jstack из jdk)
  • visual vm в jdk и / или jmx и т. Д.

Пример извлечения из первой строки такого потокаdump: ... tid = 0x0000002adaba9c00 nid = 0x754c ...

  • tid = идентификатор потока Java

  • nid = собственный идентификатор (ОСID потока)

Используйте инструменты операционной системы, чтобы узнать больше о потоке, используя собственный идентификатор (он в шестнадцатеричном формате).

Внутри Java-кода у вас естьThreadMXBean для получения дополнительной информации о потоке программно, если вы хотите http://docs.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html

2 голосов
/ 27 марта 2012

Чтение Различить потоки Java и потоки ОС? Как я уже сказал в комментарии, потоки Java - это обычные потоки ОС, просто выполняющие код JVM

1 голос
/ 27 марта 2012

jvm - это обычный процесс, который начинается с одного потока и может порождать столько потоков, сколько ему нравится. Планирование осуществляется на двух уровнях - между процессами и между потоками внутри процессов. Все это делает ОС (через libs) - jvm просто подключается. Потоки Google posix для получения более подробной информации - вот что раскрывается (API) для jvm.

Это немного подробнее: http://www.ibm.com/developerworks/java/library/j-rtj3/

0 голосов
/ 25 июня 2012

", но Java-программы запускаются на JVM, которая в моей системе (RHEL 6.1) реализован как программа, которая запускается как экземпляр пользовательского пространства. если ядро ​​не знает о потоках Java ... "

Это утверждение неверно для всех современных JVM, использующих собственные потоки. Я думаю, что это было по умолчанию с Java 1.2. Реализация собственного потока в JVM означает, что каждый раз, когда поток создает / запускает поток в коде Java, JVM просит операционную систему создать поток. Поскольку это нативные потоки, ядро ​​знает о них и обрабатывает их соответствующим образом. Кроме того, Linux поддерживает / реализует потоки POSIX, и, таким образом, в системах на основе Linux вы получите правильное поведение для потоков ваших приложений Java

...