Fil de discussion.join() équivalent en exécuteur testamentaire
J'ai une question de newbie. J'ai ce code:
public class Main
{
public static void main(String[] args) throws InterruptedException
{
//TODO Auto-generated method stub
IntHolder aHolder=new IntHolder();
aHolder.Number=0;
IncrementorThread A= new IncrementorThread(1, aHolder);
IncrementorThread B= new IncrementorThread(2, aHolder);
IncrementorThread C= new IncrementorThread(3, aHolder);
A.start();
B.start();
C.start();
A.join();
B.join();
C.join();
System.out.println("All threads completed...");
}
}
Qui va attendre que tous les threads complète. Si j'utilise Executors
comme ceci:
public class Main
{
public static void main(String[] args)
{
//TODO Auto-generated method stub
IntHolder aHolder=new IntHolder();
aHolder.number=0;
IncrementalRunable A= new IncrementalRunable(1, aHolder);
IncrementalRunable B= new IncrementalRunable(2, aHolder);
IncrementalRunable C= new IncrementalRunable(3, aHolder);
ExecutorService exec = Executors.newFixedThreadPool(3);
exec.execute(A);
exec.execute(B);
exec.execute(C);
//Don't know what to do here
System.out.println("All threads completed...");
}
}
Comment puis-je suspendre le thread principal d'attendre que tous les fils de l'exécuteur testamentaire, pour finir, je.e le "Tous les threads terminé..." doit être imprimé après tous les threads ont fait leur travail?
OriginalL'auteur Mario Stoilov | 2013-12-10
Vous devez vous connecter pour publier un commentaire.
Utilisation
shutdown() + awaitTermination()
combinaison.EDIT:
Basé sur le commentaire de @Lital
NOTE:
invokeAll()
ne sera pas de retour jusqu'à ce que toutes les tâches sont terminées (soit par défaut ou de remplir le succès de l'exécution).J'ai ajouté un autre chouette approche qui peut être suivie.
génial, c'est encore mieux, mais de changer les numéros 1,2,3 (ceux qui sont fil des numéros que j'utilise pour imprimer des messages)
Btw: il n'y a pas de attendre la résiliation, sauf si vous avez besoin de réagir. Donc, si tout ce que vous faites par la suite est de la fin du programme, un simple
shutdown()
appel est suffisant, si vous savez que le fils se terminent correctement. Sinon, un puissantshutdownNow()
est nécessaire comme une réaction àshutdown()
.Fait, une faute de frappe 🙂
OriginalL'auteur Narendra Pathai
Vous ne devriez pas utiliser exécuteur de ce genre si vous voulez attendre pour les tâches de finition.
Que faire si vous ne voulez pas/ne pouvez pas arrêter votre pool de threads exécuteur testamentaire?
C'est une méthode recommandée:
OriginalL'auteur Lital Kolog
Essayer de travailler avec un pool de threads de cette façon.
OriginalL'auteur Abdul Rasheed Mohammed
OriginalL'auteur Satheesh Cheveri