2016-01-20 8 views
6

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?

+1

Warum müssen Sie wissen? Ich kenne das auch nicht, habe aber 'ThreadPool' erfolgreich ohne solche Kenntnisse benutzt. –

+0

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 –

+0

Ich mag diese Frage, und wenn es kein Dupe ist, stimme ich, um es offen zu halten. –

Antwort

6

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.

0

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.

+0

'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

+0

@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? –

+0

* "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

0

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 
Verwandte Themen