Question

J'ai un code d'enregistrement qui doit être exécuté après toutes Threadss sont exécutées.

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ée dès que t1 et t2 sont mis en marche.

Était-ce utile?

La solution

Il suffit de 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.

Autres conseils

En plus de la jointure solution il y a aussi quelque chose appelé CountDownLatch () dans la bibliothèque java.util.concurrent. Il vous permet de l'initialiser à un certain nombre, puis attendez jusqu'à ce qu'il soit frappé le nombre de fois.

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()

Si vous exécutez le code du thread principal, gardez à l'esprit qu'il fera l'interface utilisateur pour accrocher jusqu'à ce que les deux fils complets. Cela peut ne pas être l'effet désiré.

Au lieu de cela, vous pourriez envisager une construction où chaque fil synchronise sur votre objet Logger et effectuer des appels à lui dans cette construction. Comme je ne sais pas ce que vous essayez d'accomplir spécifiquement, l'autre solution est ce que Joachim suggéré, placer uniquement ce code dans un thread.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top