2012-03-27 4 views
5

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

+1

Не уверен, но каждый поток Java обрабатывается выделенным потоком ОС. Таким образом, ваша ОС не должна знать JVM и т. Д. –

ответ

2

Read Distinguish Java threads and OS threads? Как я уже сказал в комментарии Java нитей обычные потоки ОС просто работает JVM код

+0

да, я получаю это, но plz расскажу, как интерпретация кода Java с помощью JVM-интерпретатора выполняется в этой многопоточной среде. – Tanay

+0

За исключением операций синхронизации каждая нить интерпретирует Java-код независимо как если это была единственная нить. Когда создается новый поток, ему сообщается, какой код Java интерпретировать. –

1

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

Это идет немного в деталь: http://www.ibm.com/developerworks/java/library/j-rtj3/

3

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

  • командный сигнал линии, как Ctrl + Break (Windows) или Ctrl + \ Linux) в консоли, где программа, запущенная
  • инструмент командной строки (убить -QUIT или jstack из JDK)
  • визуального VM в JDK и/или JMX и т.д.

Пример экстракт из первой строки такой нити дампа: ... TID = 0x0000002adaba9c00 NID = 0x754c ...

  • TID = ява идентификатор потока

  • нидь = родной идентификатор (ОС идентификатор потока)

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

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

0

«, но программы Java запускаются на JVM, которая в моей системе (RHEL 6.1) реализован в виде программы который запускается в качестве пользовательского пространства instance.So, без ядра осознавая ява нитей ...»

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

Смежные вопросы