2010-04-16 4 views
20

Ich verstehe, dass die jvm selbst eine Anwendung ist, die den Bytecode der ausführbaren Java-Datei in nativen Maschinencode verwandelt, aber wenn ich native Threads verwende, habe ich einige Fragen, die ich einfach nicht beantworten kann.Die nativen Java-Threads und die jvm verstehen

  • Hat ihre eigene Instanz des Jvm jeder Thread erstellen ihre bestimmte Ausführung zu behandeln?
  • Wenn nicht, dann muss der jvm eine Möglichkeit haben zu planen, welchen Thread er als nächstes behandeln wird, wenn dies nicht die Multi-Thread-Natur von Java nutzlos machen würde, da nur ein Thread gleichzeitig ausgeführt werden kann?

Antwort

22

Erstellt jeder Thread seine eigene Instanz des jvm, um ihre spezielle Ausführung zu behandeln?

Nein. Sie werden in derselben JVM ausgeführt, sodass sie (z. B.) Objekte und Klassenattribute gemeinsam nutzen können.

Wenn nicht, dann wird der Jvm haben eine Möglichkeit haben, zu planen, welcher Thread es nächstes behandelt würde, wenn so nicht dies die multi-threaded Natur von Java nutzlos, da nur ein Thread machen kann zu einem ran Zeit?

Es gibt zwei Arten von Thread-Implementierung in Java. Native Threads werden einer Thread-Abstraktion zugeordnet, die vom Host-Betriebssystem implementiert wird. Das OS kümmert sich um die native Thread-Planung und das Time Slicing.

Die zweite Art von Thread ist "grüne Fäden". Diese werden von der JVM selbst implementiert und verwaltet, wobei die JVM die Thread-Planung implementiert. Green-Thread-Implementierungen werden von Sun JVMs, AFAIK, nicht mehr unterstützt.

1

Java-Threads werden nativen OS-Threads zugeordnet. Sie haben wenig mit der JVM selbst zu tun.

8

Erstellt jeder Thread seine eigene Instanz des jvm, um ihre spezielle Ausführung zu behandeln?

Nein, Ihre in der JVM ausgeführte Anwendung kann viele Threads enthalten, die alle in dieser Instanz der JVM vorhanden sind.

Wenn nicht, dann funktioniert die Jvm haben einen Weg haben, welcher Thread zu planen als nächstes behandelt ...

Ja, hat die JVM einen Thread-Scheduler. Es gibt viele verschiedene Algorithmen für die Thread-Planung, und welche davon verwendet wird, ist JVM-abhängig. (Scheduling im Allgemeinen ist ein interessantes Thema.)

... wenn würde so nicht dies die multi-threaded nutzlos Art von Java machen, da nur ein Thread zu einem Zeitpunkt ran?

Ich bin mir nicht sicher, ob ich diesen Teil Ihrer Frage verstehe. Dies ist der Punkt des Threading. Sie haben in der Regel mehr Threads als CPUs, und Sie möchten mehr als eine Sache gleichzeitig ausführen. Durch das Threading können Sie den vollen Vorteil Ihrer CPU nutzen, indem Sie sicherstellen, dass sie gerade einen Thread verarbeitet, während ein anderer auf E/A wartet oder aus einem anderen Grund nicht beschäftigt ist.

+0

„Ja, das hat die JVM einen Thread-Scheduler. Es gibt viele verschiedene Algorithmen für die Thread-Scheduling sind, und welches verwendet wird, ist JVM-Anbieter abhängig“ Ich denke, es eine irreführende hier ist, denn wenn Java-Threads eine native erstellen Thread (nicht grüne Threads), dann benötigt JVM keinen Zeitplan oder plant nicht, weil OS dies über Kontextwechsel tut. Habe ich recht? Bitte korrigieren Sie mich, wenn ich falsch liege. – PeerNet

4

Ein Java-Thread kann eine Eins-zu-eins auf einen Kernel-Thread zugeordnet werden. Aber das muss nicht so sein. Es könnte n Kernel-Threads geben, die m Java-Threads ausführen, wobei m viel größer als n sein kann und n größer als die Anzahl der Prozessoren sein sollte. Die JVM selbst startet die n Kernel-Threads, und jeder von ihnen wählt einen Java-Thread aus und führt ihn für eine Weile aus, dann wechselt er zu einem anderen Java-Thread. Das Betriebssystem wählt Kernel-Threads aus und ordnet sie einer CPU zu. Es kann also eine Thread-Planung auf mehreren Ebenen geben. Vielleicht interessiert es Sie, sich die Programmiersprache GO anzuschauen, in der tausende so genannte "Goroutines" von Dutzenden Threads betrieben werden.

+0

AFAIK Dies ist nicht korrekt. JVM-Threads bilden 1: 1 mit dem nativen Betriebssystem ab. Können Sie ein Beispiel für das m: n-Mapping zeigen? –

+0

@PiyushKatariya - Ich denke, es ist plattformspezifisch. Zum Beispiel, alle Versionen vor Java 9 von Sun/Oracle Java für Solaris unterstützten die Zuordnung von N zu M Threads: http://reins.altervista.org/java/Java_and_Solaris_Threading.htm –

Verwandte Themen