2009-09-29 3 views
6

Ich habe einen Protokollierungscode, der ausgeführt werden muss, nachdem alle Threads s ausgeführt wurden.Wie man ein Stück Code nur ausführt, nachdem alle Threads fertig sind

Thread t1 = new MyThread(); 
Thread t2 = new MyThread(); 
t1.run(); 
t2.run(); 

doLogging(); 

Gibt es eine Möglichkeit doLogging() nur ausgeführt werden, nachdem beide Threads mit ihrer Verarbeitung fertig sind. Jetzt wird doLogging() aufgerufen, sobald t1 und t2 gestartet werden.

+2

Es sollte hingewiesen werden, dass, da Sie laufen fordern statt Start Sie erhalten bereits das gewünschte Verhalten. –

Antwort

19

Gerade join() alle Themen vor Ihrer doLogging() Aufruf:

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

// the following line will be executed when both threads are done 
doLogging(); 

Beachten Sie, dass die Reihenfolge der Anrufe join() spielt keine Rolle, wenn Sie für alle Ihre Threads warten wollen.

+0

Danke. Das hat funktioniert :) – shafi

+0

Beachten Sie, dass wenn Sie Java 1.5 oder höher verwenden, das neue java.util.concurrent gegenüber der Low-Level-Thread-Programmierung vorzuziehen ist (siehe Gregory Mostizkys Antwort). –

+0

@Jim: mit Java 1.5 oder später würde ich nicht einmal einen CountDownLatch für so etwas verwenden, sondern einen einfachen Executor. –

0

Wenn Sie den Code aus dem Hauptthread ausführen, beachten Sie, dass die Benutzeroberfläche hängen bleibt, bis beide Threads abgeschlossen sind. Dies ist möglicherweise nicht der gewünschte Effekt.

Stattdessen können Sie eine Konstruktion in Betracht ziehen, bei der jeder Thread über Ihr Logger-Objekt synchronisiert wird und Aufrufe innerhalb des Konstrukts ausgeführt werden. Da ich nicht weiß, was Sie speziell erreichen wollen, ist die andere Lösung Joachim vorgeschlagen, nur diesen Code innerhalb eines Threads zu platzieren.

6

Zusätzlich zur join() -Lösung gibt es in der Bibliothek java.util.concurrent auch etwas namens CountDownLatch. Es erlaubt Ihnen, es auf eine bestimmte Anzahl zu initialisieren und dann zu warten, bis es die angegebene Anzahl von Malen erreicht wurde.

Einfaches Beispiel:

CountDownLatch latch = new CountDownLatch(NUMBER_OF_THREADS); 
for(int i=0; i<NUMBER_OF_THREADS;i++) 
    new Thread(myCode).start(); 

latch.await(); 

Der Riegel ausdrücklich von den Arbeitsthreads getroffen werden müssen, damit diese allerdings arbeiten:

latch.countDown() 
+0

+1 für java.util.concurrent. Diese neue Funktion macht die meisten Low-Level-Thread-Programmierung in Java überflüssig. –

Verwandte Themen