2016-10-08 8 views
-1

Hier ist mein Code ein:Warum funktionieren die Gewinde nicht?

private int counter = 0; 

public void incC() { 
    counter++; 
    System.out.println("Counter is: "+counter + " "+Thread.currentThread().getName()); 
} 

public void printC() { 
    System.out.println("Counter is: "+counter + " "+Thread.currentThread().getName()); 
} 

public static void main(String args[]) throws Exception { 
     Stuff stuff = new Stuff(); 

     Thread t1 = new Thread(() -> { 
      stuff.incC(); 
     }); 

     Thread t2 = new Thread(() -> { 
      stuff.printC(); 
     }); 

     t1.start(); 
     t2.start(); 

     t1.join(); 
     t2.join(); 
    } 
} 

Hier ist meine Ausgabe:

Counter is: 1 Thread-1 
Counter is: 1 Thread-0 
  • Hier t1.join() zuerst genannt wird. Also sollte Thread t2 nicht auf Thread t1 warten, um zu sterben?
  • Wie ist es möglich, dass der Thread t2 zuerst ausgegeben wird, bevor t1?
+0

Nein, 'join()' bewirkt, dass der aktuelle Thread (der 'main'-Thread in diesem Fall) wartet, bis 't1' und' t2' beendet sind. Mit anderen Worten: Die Fäden funktionieren gut. –

+1

Wenn Sie auf die Beendigung von 't1' warten und dann 't2' starten wollen, müssen Sie nach 't1.join()' .... 't2.start()' aufrufen. – Turing85

+0

Was ist das Problem? Die Threads funktionieren wahrscheinlich, Sie müssen den Zugriff auf 'counter' synchronisieren. –

Antwort

3

t1.join() macht die aktuellen Thread Warten Gewinde t1 zu sterben. Es hat keine Auswirkungen auf das Timing eines anderen Threads außer dem aktuellen. Sie haben zwei Threads gestartet, und sie werden gleichzeitig ohne Einschränkungen für die Reihenfolge ausgeführt.

Ich sollte auch beachten, dass das Starten von zwei Threads, nur um einen auf den Tod des anderen zu warten, den Zweck des Multithreading vereitelt.

+1

Ich finde, dass diese Neulinge oft falsch verstehen, was" aktueller Thread "bedeutet. Zuallererst, welcher Thread ist "aktuell", wenn Sie acht CPUs haben, die alle anspringen? Dann koppeln Sie das mit der Tatsache, dass noobs oft nicht erkennen, dass der Haupt-Thread ein Thread ist. Sie kommen mit Ideen wie, der aktuelle Thread ist der Thread, den "Ich" gerade erstellt und gestartet hat. Ich erkläre gerne 'join()', indem ich etwas wie "t1.join()' sagt, tut nichts zu 't1'; Es wartet nur darauf, dass' t1' stirbt. " –

0
  1. join() Kräfte Strom (in Ihrem Fall das Haupt) Thread zu Tode t1, zu warten, so weiter t2
  2. Auftrag für Thread-Ausführung arbeiten ist nicht festgelegt, weil sie parallel
0
arbeiten

Beide Threads arbeiten parallel und garantieren daher nicht, welcher Thread in Ihrem Fall zuerst fertig ist.

Wenn Sie möchten, dass ein bestimmter Thread zuerst beendet wird, müssen Sie ihn starten und mit Ihrem Hauptthread verbinden, dann starten und den zweiten Thread wie folgt verbinden.

t1.start(); 
    t1.join(); 

    t2.start(); 
    t2.join(); 

Legen Sie Namen für die Threads für ein besseres Verständnis fest.

Ändern Sie auch Ihre Frage, weil Ihre Threads einwandfrei funktionieren.

Verwandte Themen