2017-02-16 3 views
-1

Ich bin Themen jetzt in der Schule lernen, und wir hatten ein Programm zu schreiben, das mehrere Threads verwendet, aber es funktioniert nicht richtig, bis ich thread.join() verwendetThread.join() Erklärung

Es funktioniert, wie es sollte jetzt, aber ich bin mir nicht ganz sicher, was passiert.

Ursprünglich hatte ich so etwas. Es verursachte die Ausgabe der Threads miteinander zu Konflikt.

Ich tat dies dann, und die Ausgabe war gut und die richtige Antwort wurde erreicht.

t1.start(); 
t1.join(); 
t2.start(); 
t2.join(); 
t3.start(); 
t3.join(); 

Meine Frage ist, was passiert im ersten Beispiel im Vergleich zum zweiten? Ich habe gegoogelt und auf stackoverflow gesucht, kann aber keine Antwort finden, die mir völlig hilft.

+0

Wenn Ihr Programm sehen war nicht auf '.join vor den Anrufen arbeiten()' dann werden Sie wahrscheinlich wurden in ein Synchronisationsproblem (ohne den gesamten Code ist es schwer zu sagen). Wenn Sie die gleichen Objekte in den 3 Threads teilen und modifizieren, möchten Sie vielleicht eine Art von Synchronisation in Betracht ziehen. – Jayfray

+0

Genau auf das, was ich jetzt untersuche, bin ich über einen Post gestolpert.Ich teile ein 2D-Array über Threads. – sbowde4

+1

Sie werden wahrscheinlich das synchronisierte Schlüsselwort oder das [ReentrantLock] (http://docs.oracle.com/javase/lps/api/java/util/concurrent/locks/ReentrantLock.html) sehen wollen. – Jayfray

Antwort

3

t.join() bewirkt, dass der aktuelle Thread die Ausführung pausiert, bis der Thread beendet ist.

Auf diese Weise:

t1.start(); 
t1.join(); 
t2.start(); 
t2.join(); 
t3.start(); 
t3.join(); 

gibt es keinen Grund Threads zu verwenden ...

thead.join() verwenden Beispiel:

Lassen Sie uns sagen Sie 3 Dateien verschlüsseln müssen, möchten Sie Threads für schnellere Verarbeitungszeit verwenden, und Sie möchten wissen, wie viel Zeit es dauerte:

int startTime = System.currentTimeMillis(); 
firstFileEncryptorThread.start(); 
secondFileEncryptorThread.start(); 
thirdFileEncryptorThread.start(); 

firstFileEncryptorThread.join(); 
secondFileEncryptorThread.join(); 
thirdFileEncryptorThread.join(); 

System.out.println(System.currentTimeMillis() - startTime); 
+1

Um es genauer auszudrücken, da Sie immer darauf warten, dass der vorherige Thread beendet wird, bevor Sie den nächsten Thread starten, haben Sie nie mehr als 1 Thread gleichzeitig ausgeführt, was den Zweck der Verwendung von Threads ziemlich vollständig zunichte macht. – Carcigenicate

+0

Ich habe gesehen, dass ich einen Beitrag über die Synchronisierung von Threads gesehen habe, aber er wurde gelöscht, als ich darüber gesprochen habe. Meine Threads führen alle Operationen auf demselben 2D-Array aus. Anstatt also thread.join() zu schreiben, werde ich in die Thread-Synchronisation schauen: – sbowde4

+0

"Es gibt keinen Grund, Threads zu verwenden ...", also wurde die Methode 'join()' irrtümlich eingeführt? :-) Wenn ein Thread wartet, um das Ergebnis eines anderen Thread-Abschlusses einzugeben, müssen Sie 'join()' – davidxxx

0

Als Javadoc:

Wartet auf diesen Thread zu sterben. Ein Aufruf dieser Methode verhält sich in genau der gleichen Weise wie der Aufruf

Also, wenn Sie t1.join(); der Faden in Wich rufen Sie den Anruf warten zu t1 machen haben, bevor zu beenden die nächste Zeile ausgeführt wird. Wenn t1 niemals beendet wird, wird die nächste Zeile niemals ausgeführt.

+0

also t2 ist nicht abhängig von t1? Bedeutet das, dass sie parallel zueinander laufen können? – sbowde4

+0

Das ist das Konzept des Threads. Überprüfen Sie, indem Sie tun: t1.start(); t2.start(); t1.join(); – JFPicard

0

Das zweite Beispiel, was Sie getan haben, ist tatsächlich ähnlich zu einem einzelnen Thread - was bedeutet, dass Sie einen Thread ausführen, warten Sie auf den Abschluss und dann den nächsten Thread.

public final void join(): Diese Java-Thread-Join-Methode setzt den aktuellen Thread auf warten, bis der Thread, auf dem er aufgerufen wird, tot ist. Wenn der Thread unterbrochen wird, wird InterruptedException ausgelöst.

Im ersten Beispiel - alle Gewinde sind parallel

laufen ähnliche Frage here