Java-Threads gegen OS-Threads
Sieht aus wie ich Durcheinander mit Java-Threads/OS-Threads und Interpretiert Sprache.
Bevor ich beginne, ich verstehe, dass Green Threads sind Java-Threads, wo der Durchzug ist gesorgt durch die JVM und die gesamte Java-Prozess läuft nur als single OS Thread. Dabei auf einer multi-Prozessor-system ist es nutzlos.
Nun meine Fragen ist. Ich habe zwei Threads A und B, die Jeweils mit 100 tausend Zeilen unabhängigen code. Ich Laufe diese threads in meinem Java-Programm auf einem Multiprozessor-system. Jeder Thread erhält eine native OS-Thread LAUFEN, die laufen können, auf eine andere CPU, aber da Java interpretiert wird, diese threads benötigen, um die Interaktion mit der JVM wieder und wieder zu konvertieren, die byte-code-to-machine-Anweisungen ? Bin ich im Recht ? Wenn ja, als für kleinere Programme mit Java-Threads nicht ein großer Vorteil ?
Sobald der Hotspot kompiliert diese beiden Ausführungspfade beide so gut sein können wie native Threads ? Bin ich im Recht ?
[EDIT] : Eine Alternative Frage gestellt werden kann, angenommen, Sie haben eine einzelne Java-Thread, dessen code nicht JIT-kompiliert haben, erstellen Sie diesen Thread und start ()? Wie funktioniert der OS-Thread und JVM interagieren zu laufen, dass Bytecode ?
Dank
InformationsquelleAutor der Frage Geek | 2010-12-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du vermischt zwei verschiedene Dinge; JIT erfolgt durch die VM und die threading-Unterstützung der VM. Tief im Innern, alles, was Sie tun übersetzt, um irgendeine Art von nativen code. Eine byte-code-Anweisung, die verwendet thread ist nichts anderes als ein JIT ' ed code, welcher auf threads.
Definieren hier klein. Für kurzlebige Prozesse, ja, threading nicht, dass groß ein Unterschied, da Ihre sequentielle Ausführung ist schnell genug. Beachten Sie, dass diese wiederum ist abhängig von dem problem. Für die UI-toolkits, egal wie klein die Anwendung, die irgendeine Art von threading und asynchroner Ausführung erforderlich ist, damit das UI reagiert.
Threading auch Sinn macht, wenn man Dinge, die kann parallel ausgeführt werden. Ein typisches Beispiel wäre heavy IO auf dem Gewinde, und die Berechnung in einem anderen. Sie wirklich nicht wollen, zu blockieren, Ihre Verarbeitung, nur weil dein main-thread blockiert, tut IO.
Siehe meinen ersten Punkt.
Threading ist wirklich nicht eine silberne Kugel, esp, wenn es um das häufige Missverständnis von "use threads, damit dieser code schneller gehen". Ein bisschen Lesen und erleben werden, wird Ihre beste Wette. Kann ich empfehlen, immer eine Kopie der dieses tolle Buch? 🙂
Wieder ich werde sagen, es, threading ist ein völlig anderes Konzept von JIT. Lassen Sie uns versuchen, zu betrachten, die die Ausführung eines Programms in einfachen Worten:
Wenn das JIT-hat getreten, in:
Wie Sie sehen können, unabhängig von der route, die Sie Folgen, die VM-Instruktion abgebildet werden muss, um zu seinem nativen Pendant an einem gewissen Punkt in der Zeit. Ob dieser native code ist gespeichert für die weitere Wiederverwendung oder weggeworfen, wenn eine andere Sache (Optimierung, erinnern Sie sich?).
Also um deine Frage zu beantworten, Wann immer Sie schreiben threading-code, es ist übersetzt in nativen code, und führen Sie von das OS. Ob, dass die übersetzung on-the-fly und sah bis zu diesem Zeitpunkt ist eine völlig andere Frage.
InformationsquelleAutor der Antwort Sanjay T. Sharma
Dies ist nicht wahr. So ist nicht angegeben, sehen wir oft, dass Java-threads sind in der Tat native OS-threads und Multithreading-Java-Anwendungen wirklich machen Verwendung von multi-core-Prozessoren oder multi-Prozessor-Plattformen.
Einer gemeinsamen Empfehlung ist die Verwendung eines thread-pool, wo die Anzahl der threads ist proportional zu der Anzahl der cores (Faktor 1-1.5). Dies ist ein weiterer Hinweis, dass die JVM ist nicht nur auf einen einzigen OS-thread /Prozess.
Aus wkipedia:
Nun, zurück im Jahr 2010 mit Java 7 unter Entwicklung und Java 8 geplant - sind wir wirklich noch interessiert an der historischen "green threads"??
InformationsquelleAutor der Antwort Andreas_D
green threads wie du es beschreibst
(Einplanung erfolgt durch die JVM auf einem
einzelne nativen thread), aber normal
Implementierungen von Java auf PC verwenden
mehrere Kerne.
InformationsquelleAutor der Antwort Mnementh
Einfädeln und ausführen von ein-byte-code sind zwei getrennte Themen. Green threads verwendet werden, durch die JVM auf Plattformen, die nicht über native Unterstützung von threads. (IMHO, ich weiss nicht, welche Plattform unterstützt keine threads).
Byte-code in Echtzeit interpretiert und ausgeführt auf der nativen Plattform durch die JVM. JVM entscheidet, was sind die beliebtesten code-Fragmente und führt die so genannte Just-in-time Kompilierung dieser Fragmente, so ist es nicht kompilieren Sie wieder und wieder. Dies ist unabhängig auf dem Durchzug. Wenn Sie zum Beispiel ein thread, der ausgeführt wird, den gleichen code-fragment in der Schleife, die Sie in diesem fragment wird zwischengespeichert werden durch just-in-time-compiler.
Fazit: Mach dir keine sorgen über die performance und threads. Java ist stark genug, um alles der Codierung.
InformationsquelleAutor der Antwort AlexR