2016-11-16 19 views
-1

Ich kann einfach nicht verstehen, in welcher Reihenfolge das Programm ausgeführt wird.Threads und Verwirrung über die Reihenfolge der Ausführung

public class sub { 
    public static void main(String args[]) 
    { 
     base b1 = new base(); 
     b1.s="b1"; 
     b1.start(); 
     base b2 = new base(); 
     b2.s="b2 "; 
     b2.start(); 

     try { 
      Thread.sleep(10000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

public class base extends Thread{ 

    String s; 
    @Override 
    public void run() { 
    for(int i=0;i<5;i++) 
    { 
     System.out.println(s+" "+i); 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    // TODO Auto-generated method stub 

} 


} 

Der Ausgang ist

b2 0 
b1 0 
b2 1 
b1 1 
b2 2 
b1 2 
b1 3 
b2 3 
b2 4 
b1 4 

Könnte jemand bitte erklären, warum die Ausgabe in dieser Reihenfolge ist. Warum ist das zuerst b2 vor b1 und nicht b1 vor b2? Warum wird dann zuerst b1 ausgeführt?

+5

In einer asynchronen Ausführung (wenn Sie mehrere Threads starten) gibt es keine Garantie, welcher Thread zuerst gestartet oder zuerst abgeschlossen wird. Siehe http://stackoverflow.com/questions/40306342/how-much-of-a-threads-code-get-executed-ever-time-it-is-scheduled/40306449#40306449 – donlys

+0

Und wenn Sie das steuern möchten Um zu bestellen, versuchen Sie ExecutorService. http://stackoverflow.com/questions/2153663/controlling-task-execution-order-with-executorservice –

+2

Wenn Sie eine bestimmte Ausführungsreihenfolge möchten, warum verwenden Sie Threads? – EJP

Antwort

0

Es kann nicht garantiert werden, dass ein Thread vor dem anderen ausgeführt wird. In diesem Fall kann es vorkommen, dass der Scheduler versucht, Kontextwechsel zu vermeiden, so dass er versucht, den Hauptthread am Laufen zu halten. Außerdem braucht es Zeit, um einen neuen Thread zu starten. Vielleicht werden zu dem Zeitpunkt, zu dem der Hauptthread in den Ruhezustand geht, beide b1 und b2 gestartet, die zuerst zu laufen beginnen und die gewählt werden, um die Sperre auf dem stdout-Druckstrom zu erhalten, sind beide willkürliche Entscheidungen an diesem Punkt.

Verwandte Themen