2009-09-29 10 views
6

J'ai un code de log qui doit être exécuté après que tous les Threads sont exécutés.Comment exécuter un morceau de code seulement après que tous les threads aient été exécutés

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

doLogging(); 

Est-il possible d'exécuter doLogging() seulement après que les deux fils sont effectués avec leur traitement. Maintenant que doLogging() est appelé dès que t1 et t2 sont démarrés.

+2

Il convient de souligner que, puisque vous appelez courir au lieu de départ vous obtenez déjà le comportement désiré. –

Répondre

19

Juste join() toutes les discussions avant votre appel doLogging():

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

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

Notez que l'ordre des appels join() n'a pas d'importance si vous voulez attendre tous vos fils.

+0

Merci. Cela a fonctionné :) – shafi

+0

Notez que si vous utilisez Java 1.5 ou plus récent, le nouveau java.util.concurrent devrait être préféré à la programmation de thread de bas niveau (voir la réponse de Gregory Mostizky). –

+0

@Jim: avec Java 1.5 ou plus tard je n'utiliserais même pas un CountDownLatch pour une telle chose, mais un simple Executor. –

0

Si vous exécutez le code à partir du thread principal, gardez à l'esprit que l'interface utilisateur va se bloquer jusqu'à ce que les deux threads se terminent. Cela peut ne pas être l'effet désiré. Au lieu de cela, vous pouvez envisager une construction dans laquelle chaque thread se synchronise sur votre objet Logger et y effectue des appels dans cette construction. Puisque je ne sais pas ce que vous essayez d'accomplir, l'autre solution est ce que Joachim suggère, en plaçant ce code dans un fil.

6

En plus de la solution join(), il existe également un élément appelé CountDownLatch dans la bibliothèque java.util.concurrent. Il vous permet de l'initialiser à un certain nombre et ensuite attendre jusqu'à ce qu'il ait été frappé le nombre de fois spécifié.

Exemple simple:

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

latch.await(); 

Le verrou doit être frappé de façon explicite par les threads de travail pour que cela fonctionne bien:

latch.countDown() 
+0

+1 pour java.util.concurrent. Cette nouvelle fonctionnalité rend la plupart des threads de programmation de bas niveau inutiles. –