Erzeugt jeder Thread seine eigene Instanz der JVM, um seine spezielle Ausführung zu bewältigen?
Nein. Sie werden in derselben JVM ausgeführt, so dass sie (zum Beispiel) Objekte und Klassenattribute gemeinsam nutzen können.
Wenn nicht, dann muss die JVM eine Möglichkeit haben, zu planen, welchen Thread sie als nächstes bearbeiten wird
In Java gibt es zwei Arten der Thread-Implementierung. Native Threads werden auf eine Thread-Abstraktion abgebildet, die durch das Host-Betriebssystem implementiert wird. Das Betriebssystem kümmert sich um die Planung der nativen Threads und die Zeitaufteilung.
Die zweite Art von Threads sind "grüne Threads". Diese werden von der JVM selbst implementiert und verwaltet, wobei die JVM die Thread-Planung übernimmt. Java Green-Thread-Implementierungen werden von Sun/Oracle JVMs seit Java 1.2 nicht mehr unterstützt (siehe Grüne Fäden vs. nicht grüne Fäden )
Wenn ja, würde dies nicht die Multithreading-Natur von Java nutzlos machen, da nur ein Thread zur gleichen Zeit ausgeführt werden kann?
Wir sprechen jetzt über grüne Fäden, und dies ist (nur) aus der Java-Perspektive von historischem Interesse.
-
Grüne Threads haben den Vorteil, dass Scheduling und Kontextwechsel im Nicht-I/O-Fall schneller sind. (Basierend auf Messungen, die mit Java unter Linux 2.2 durchgeführt wurden; http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.8.9238 )
-
Bei reinen grünen Threads werden N Programmiersprachen-Threads auf einen einzigen nativen Thread abgebildet. Bei diesem Modell gibt es keine echte parallele Ausführung, wie Sie festgestellt haben.
-
Bei einer hybriden Thread-Implementierung werden N Threads der Programmiersprache auf M native Threads abgebildet (wobei N > M). In diesem Modell ist der prozessinterne Thread-Scheduler für die Zuordnung von grünen Threads zu nativen Threads zuständig UND Sie erhalten eine echte parallele Ausführung (wenn M > 1); siehe https://stackoverflow.com/a/16965741/139985 .
Aber auch mit den reinen grünen Threads gibt es noch Gleichzeitigkeit. Die Kontrolle wird auf einen anderen Thread umgeschaltet, ein Thread blockiert eine E/A-Operation, der Thread erhält eine Sperre und so weiter. Darüber hinaus könnte die Laufzeit der JVM eine periodische Thread-Preemption implementieren, so dass ein rechenintensiver Thread den (einzigen) Kern nicht unter Ausschluss anderer Threads monopolisiert
0 Stimmen
Die JVM ist ein Prozess. Threads existieren innerhalb von Prozessen. Nicht andersherum. Native Threads werden vom Betriebssystem geplant, nicht von der JVM. Das ist die Bedeutung von "nativ".