2016-03-11 15 views

Antwort

1

Angenommen, Sie fragen den Unterschied zwischen den Zuständen Thread.State.BLOCKED und Thread.State.WAITING (d. H. Wie von t.getState() zurückgegeben)?

Ich möchte wissen, was der Unterschied auf Jvm Ebene ist und was für einen Unterschied auf der CPU

von unten nach Aufarbeitung, gibt es keinen Unterschied in der Hardware-Ebene, da diese Staaten keine Hardware-Konzepte sind . WAITING-Threads und BLOCKED-Threads verwenden überhaupt keine CPU-Ressourcen. Wenn eine CPU den Programmcode nicht ausführt, führt sie entweder Code aus, der zu einem anderen Prozess gehört, oder zum Betriebssystem. oder es ist in einem Leerlaufzustand, der nichts mit Java oder JVMs zu tun hat.


Dann übersprungen Sie eine Schicht - das Betriebssystem. Alle praktischen JVMs implementieren Java-Threads unter Verwendung von Threading-Primitiven, die vom Betriebssystem bereitgestellt werden.

Im Betriebssystem wird jeder Thread durch ein Objekt repräsentiert, das alle Informationen enthält, die das Betriebssystem über den Thread wissen muss. Wenn auf einer CPU ein Thread ausgeführt wird, teilt das Objekt dem Betriebssystem mit, welche CPU und wie lange es ausgeführt wird usw. Wenn ein Thread nicht ausgeführt wird, enthält das Objekt einen Snapshot des CPU-Status, der wiederhergestellt werden muss Fadenlauf noch einmal.

Jedes Thread-Objekt im Betriebssystem kann in einem von mehreren Containern gefunden werden: Es gibt einen Container, der die Menge aller laufenden Threads enthält, und es gibt andere Container (Warteschlangen meistens), die die Threads enthalten, die nicht ausgeführt werden.

In der Regel gibt es eine Laufwarteschlange, die die Threads enthält, die zwar ausgeführt werden können, aber auf die Ausführung einer CPU warten. Dann gibt es eine Warteschlange für jedes Mutex (a.k.a., arretieren), die, für die Fäden zu warten, dass der mutex einzugeben, eine Warteschlange jeden Bedingungsvariable der Fäden enthält, die darauf warten, zu sein notify() d über diesen Zustand etc.

Immer dann, wenn einige Fäden hinterlassen einen Mutex hält die Das Betriebssystem betrachtet die Warteschlange für diesen Mutex. Wenn die Warteschlange nicht leer ist, wird ein Thread aus dieser Warteschlange ausgewählt und in die Ausführungswarteschlange verschoben. Immer wenn ein Thread o.notify() aufruft, wählt das Betriebssystem einen Thread aus der Warteschlange dieser Bedingungsvariablen aus und verschiebt ihn in die Ausführungswarteschlange. Wenn das Programm notifyAll() aufruft, verschiebt das Betriebssystem alle Threads aus dieser Warteschlange in die Ausführungswarteschlange.

Also, auf OS-Ebene, dann ist es nicht so sehr darum, was Zustand ist der rote Faden in, da es sich um eine Frage, welche ist Warteschlange ist der rote Faden in.


Schließlich Auf der JVM-Ebene gibt es nicht mehr viel zu sagen, da die JVM das OS so ziemlich die gesamte Arbeit erledigen lässt. Java stellt die beiden Zustände RUNNING und WAITING lediglich als eine Annehmlichkeit für Sie, den Programmierer, zur Verfügung, falls es für Sie nützlich ist, den Unterschied zu kennen. (Hinweis: Es ist vor allem interessant, wenn Sie einen Dump des Programms betrachten und versuchen herauszufinden, was jeder Thread zu der Zeit gemacht hat.)

+0

vielen Dank. diese Ausgabe meine vielen Tage .. danke deine Antwort .. ich habe verstanden .. – Timi

0

Wartezustand ist, wenn der Thread absichtlich die wait() - Methode aufgerufen hat. Es bedeutet, dass es darauf wartet, dass ein Ereignis/eine Aktion abgeschlossen wird. Es ist so, als ob du zur Kundenbetreuung gehst und die Warteschlange leer ist. Sie warten darauf, dass Ihre Frau mit der Garantiekarte eintrifft. Sie warten also absichtlich.

Aber im Zustand BLOCKED ist Thread bereit zu laufen, aber andere Ereignisse blockierten es aus irgendeinem Grund. Wie ein Thread gerade in einen synchronisierten Block eintritt, aber ein anderer Thread gerade in einem synchronisierten Block auf demselben Objekt läuft.

Ein anderes Beispiel ist mehrere Thread namens Wait-Methode für ein Ereignis abzuschließen. Sobald dieses Ereignis abgeschlossen ist, wird notifyAll() aufgerufen. Dann wird nur ein Thread CPU-Zyklus bekommen andere werden immer noch blockiert

Es ist wie Sie zur Kundenbetreuung gehen und kein Kundenvertreter ist anwesend. Du bist blockiert.

+0

Was ist der Unterschied auf CPU- und JVM-Ebene? ob die cpu scheduler ein Thread wartet oder blockiert ... so denkt man das. – Timi

Verwandte Themen