Ich möchte wissen, wie und wann ein Thread hin und her zwischen runnable und running states.Was passiert eigentlich hinter den Kulissen.Ich denke, das wird im Falle von ThreadPool benötigt werden, aber ich bin nicht in der Lage, vollständig zu verstehen.Bitte helfen Ich verstehe das.Wie bewegt sich ein Thread vom running- zum runnable-Zustand?
Antwort
wenn Thread in Laufzustand ist, der seine Ausführung run() Methode bedeutet, und, wenn seine in runnable Verfahren das Ausführen von start() - Methode .... also ich denke, von running zu runnable bewegen bedeutet, dass es von run() zu starten() zurückgeht
In der Nomenklatur der meisten Betriebssysteme bedeutet "running", dass der Thread tatsächlich Anweisungen auf einer CPU ausführt, und "runnable" bedeutet, dass der Thread nicht "ausgeführt" wird, außer der Verfügbarkeit einer CPU zum Ausführen.
Ein Java-Programm kann den Unterschied zwischen diesen beiden Zuständen nicht unterscheiden. Die Thread-Zustände, von denen Java weiß, sind NEU, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING und TERMINATED.
Ein Thread ist NEU, bevor t.start()
aufgerufen wird, und es kann nie wieder zu NEW zurückgehen. WAITING und TIMED_WAITING bedeuten, dass der Thread in einem anderen Thread auf einen notify()
Aufruf wartet. BLOCKED bedeutet, dass es auf irgendetwas anderes wartet (z. B. um einen synchronized
Block einzugeben), und TERMINATED bedeutet, dass es beendet ist.
Yield
ist eine statische Methode, die dem aktuell ausführenden Thread mitteilt, dass er den Threads mit gleicher Priorität im Thread-Pool eine Chance gibt.
Es kann nicht garantiert werden, dass Yield
den aktuell ausgeführten Thread sofort in den Runnable-Zustand versetzt. Erinnern Sie sich an einen wichtigen Punkt, dass die Yield-Methode nicht dazu führt, dass der Thread in den Status "Warten" oder "Blockiert" wechselt. Es kann nur einen Thread von Running State in Runnable State erstellen.
'yield()' wird selten genannt, und es ist sicherlich nicht der Hauptmechanismus bei der Arbeit hier. Verwenden Sie keine Codeformatierung für Text, der kein Code ist. – EJP
@Anand ..... danke für die Erklärung. Noch ein Zweifel ... wir werden Ertrag in unserem Code manuell verwenden ... richtig? Wie kümmert sich JVM alleine? –
* "Es gibt keine Garantie, dass Yield den aktuell ausgeführten Thread sofort in den runnable Zustand versetzt." * ... In der Tat. Es wäre vollkommen akzeptabel für eine JVM, überhaupt nichts zu tun, wenn Thread.yield() aufgerufen wird. Ein Programm, das von dem Verhalten von Thread.yield() für seine Korrektheit abhängt, ist im besten Fall ein nicht-portables Programm und im schlimmsten Fall ein zutiefst fehlerhaftes Programm. – scottb
Extrakt aus einem Programmierhandbuch zu Java SCJP Zertifizierung: Themen:
static void Ausbeute() Dieses Verfahren verursacht den aktuellen Thread vorübergehend seine Ausführung zu unterbrechen und dadurch zulassen, dass andere Threads auszuführen. Es obliegt der JVM zu entscheiden, ob und wann dieser Übergang stattfinden wird.
static void sleep (lange Millisekunden) löst InterruptedException Der aktuelle Thread wird für die angegebene Zeit in den Ruhezustand versetzt, bevor er erneut ausgeführt werden kann.
final Hohlraum join() throws InterruptedException final void (lange millisec) throws InterruptedException auf einem Thread wartet, aufgerufen, um einen Anruf zu einem dieser beiden Verfahren kommen und nicht zurück, bis entweder der Thread abgeschlossen ist oder abgelaufen ist nach der angegebenen Zeit jeweils.
void interrupt() Die Methode unterbricht den Thread, auf dem sie aufgerufen wird. In den Zuständen "Warten auf Benachrichtigung", "Schlafen" oder "Blockiert auf Join-Abschluss" erhält der Thread eine InterruptedException.
Unten Beispiel veranschaulicht Übergänge zwischen Thread-Zuständen. Ein Thread bei (1) schläft ein wenig bei (2) und führt dann eine Berechnung in einer Schleife bei (3) durch, wonach der Thread endet. Die main() -Methode überwacht den Thread in einer Schleife bei (4) und gibt den von der Methode getState() zurückgegebenen Thread-Status aus. Die Ausgabe zeigt, dass der Thread den RUNNABLE-Status durchläuft, wenn die Methode run() ausgeführt wird, und dann in den Status TIMED_WAITING in den Ruhezustand übergeht. Beim Aufwecken berechnet es die Schleife im Zustand RUNNABLE und geht in den Status TERMINATED über, wenn die Methode run() beendet wird.
Beispiel: Staaten Thread
public class ThreadStates {
private static Thread t1 = new Thread("T1") { // (1)
public void run() {
try {
sleep(2); // (2)
for(int i = 10000; i > 0; i--); // (3)
} catch (InterruptedException ie){
ie.printStackTrace();
}
}
};
public static void main(String[] args) {
t1.start();
while(true) { // (4)
Thread.State state = t1.getState();
System.out.println(state);
if (state == Thread.State.TERMINATED) break;
}
}
}
mögliche Ausgabe aus dem Programm:
RUNNABLE
TIMED_WAITING
...
TIMED_WAITING
RUNNABLE
...
RUNNABLE
TERMINATED
- 1. Objekt bewegt sich vom Bildschirm
- 2. Wie unterscheidet sich Dispatcher vom Hintergrund-Thread?
- 3. Bild bewegt sich nicht?
- 4. Schließt sich ein Thread automatisch?
- 5. Maus bewegt sich auf Element
- 6. Siebel NextRecord-Methode bewegt sich nicht zum nächsten Datensatz
- 7. Wie bewegt man sich in QtDesigner?
- 8. Ball bewegt sich nicht wie ich will
- 9. Arduino Servo bewegt sich randomely
- 10. Long-running Asynchronous Thread in WCF
- 11. GridSplitter bewegt sich sehr langsam
- 12. UIButton bewegt sich, wenn gedrückt
- 13. Lassen Sie sich vom ersten Thread zur Folge abgeschlossen
- 14. Erkennen, wenn sich die Maus tatsächlich bewegt, nicht nur wenn sich die Seite bewegt
- 15. Ein Array so sortieren, dass sich der Index nicht bewegt?
- 16. Bild bewegt sich hinter dem div
- 17. Ein Auto simulieren, das sich entlang einer Bahn bewegt
- 18. Wie verhindere ich, dass sich ein WPF-Combobox-Popup löst, wenn sich das Combobox bewegt?
- 19. Warum bewegt sich ein Div Schock so viel
- 20. Versteckte Navigationsleiste bewegt sich Ansicht "nach oben"
- 21. Capsule Collider bewegt sich nicht reibungslos
- 22. Grunzen imagemin bewegt sich nicht unoptimized Bilder
- 23. Wie man vom Ende der Datei zum Anfang in C++ bewegt
- 24. UITableViewCell bewegt sich nicht auf und ab
- 25. geom_smooth bewegt sich basierend auf scale_y_continuous limits
- 26. SKCameraNode verharrt, wenn Spieler sich bewegt
- 27. CSS Slider bewegt sich nach links
- 28. Machen bewegt sich mit websockets und python/django (/ twisted?)
- 29. FAB bewegt sich nicht auf Snackbar ab
- 30. Erkennen, wenn sich die Maus nicht bewegt
Warum müssen Sie wissen? Ich kenne das auch nicht, habe aber 'ThreadPool' erfolgreich ohne solche Kenntnisse benutzt. –
Ich frage mich nur ... wenn der Thread im laufenden Zustand ist, bedeutet das, dass er run() -Methode ausführt und wenn er in der runnable-Methode seine start() -Methode ausführt .... also rate ich von runnable zu runnable zurück von run() zu starten() .... bitte korrigieren Sie mich, wenn ich falsch liege, da ich ein Anfänger bin Multithreading –
Ich mag diese Frage, und wenn es kein Dupe ist, stimme ich, um es offen zu halten. –