2012-03-27 10 views
5

Guys ich habe kürzlich Multedread Programmierung mit Java im Falle von Linux-Threads, ich weiß, dass der Kernel sie plant (wie sie sind die Einheitseinheiten, die geplant sind), aber Java-Programme auf JVM ausgeführt werden, die in meinem System (RHEL 6.1) ist als ein Programm implementiert, das als User-Space-Instanz ausgeführt wird. Also, ohne dass der Kernel sich der Java-Threads bewusst ist, wie kommt es, dass präemptives Multitasking in JVM ausgeführt wird? es wird hilfreich sein, wenn der ganze Mechanismus der JVM und Kernel-Interaktion in diese Sache zu tun .plz zitiert mögliche Quellen von Informationen gegebenWie sind Java-Threads geplant?

+1

Nicht sicher, aber jeder Java-Thread wird von einem dedizierten Betriebssystem-Thread behandelt. Also muss Ihr Betriebssystem nicht auf JVM usw. achten. –

Antwort

2

liest Distinguish Java threads and OS threads? Wie ich in den Kommentar Java-Threads das sind ganz normale OS Threads nur JVM Code ausgeführt

+0

Ja, ich verstehe es, aber plz sagen Sie mir, wie die Interpretation von Java-Code durch JVM-Interpreter in dieser Multithread-Umgebung erfolgt – Tanay

+0

Außer Synchronisationsaktionen interpretiert jeder Thread Java-Code unabhängig als wenn es der einzige Thread wäre. Wenn ein neuer Thread erstellt wird, wird angegeben, welcher Java-Code interpretiert werden soll. –

1

Die jvm ist nur ein normaler Prozess, der mit einem Thread beginnt und hinterher so viele Threads erzeugen kann, wie er will. Die Planung erfolgt auf zwei Ebenen - zwischen Prozessen und zwischen Threads innerhalb von Prozessen. All dies geschieht über das Betriebssystem (via libs) - der jvm greift einfach ein. Google posix threads für mehr Details - das ist was dem jvm ausgesetzt (API).

Dies geht ein bisschen in den Details: http://www.ibm.com/developerworks/java/library/j-rtj3/

3

Themen in den Java/JVM Prozesslandkarten zu einem nativen Thread und Sie können sowohl die Java-Thread-ID und den native Thread-ID in einem Thread-Stack-Trace-Dump sehen. Holen Sie sich den Thread-Stack aller Java-Threads Ihr Lieblingswerkzeug:

  • Befehlszeilensignale wie Strg + Pause (Fenster) oder ctrl + \ linux) in der Konsole, auf die das Java-Programm wird
  • Kommandozeilen-Tool ausgeführt wird (töten -quit oder jstack aus der JDK)
  • visuelle vm in JDK und/oder jmx etc

Beispiel Extrakt von der ersten Zeile eines solchen Gewindes dump: ... tid = 0x0000002adaba9c00 NID = 0x754c ...

  • tid = Java-Thread-ID

  • nid = native id (die OS-Thread-ID)

Verwenden Sie die Werkzeuge des Betriebssystems mehr über das Gewinde die native id (es verwendet, um herauszufinden, ist in hex).

Innerhalb des Java-Code, den Sie ThreadMXBean haben programmatisch mehr Thread Informationen abrufen, wenn Sie wollen http://docs.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html

0

„, aber Java-Programme werden auf JVM ausgeführt werden, die in meinem System (RHEL 6.1) als ein Programm implementiert ist dass als User-space laufen instance.So, ohne den Kernel kennt die Java-Threads zu sein ...“

Diese Aussage für alle modernen JVM nicht korrekt ist, die eigene Threads verwenden. Ich denke, das war der Standard seit Java 1.2. Native Thread-Implementierung durch eine JVM bedeutet, dass jedes Mal, wenn ein Thread einen Thread in Java-Code instanziiert/ausführt, die JVM das Betriebssystem auffordert, den Thread zu erstellen. Da es sich um native Threads handelt, kennt der Kernel diese und behandelt sie entsprechend.Darüber hinaus unterstützt/implementiert Linux POSIX-Threads, und als solches erhalten Sie auf einem Linux-basierten System ein Pthread-Verhalten für die Threads Ihrer Java-Anwendungen

Verwandte Themen