2016-11-24 1 views
1

J'ai un code où j'ai affaire à plusieurs threads. Un thread attend l'exécution de certains autres threads dont il dépend.Thread étant appelé plusieurs fois

Mon code d'exécution pour le fil ressemble

public void run() { 

    for (final String name : nameList) { 
     final Thread thread = getThreadByName(name); 
     if (thread != null) { 
      while (thread.isAlive()) { 
       thread.join(); 
      } 
     } 
    } 
    //perform action 
} 

Il y a peu d'autres threads en attente pour ce thread pour terminer l'exécution dans la même méthode comme run() en appelant join() comme indiqué. Supposons que ce thread dépende de trois autres threads et qu'il attend leur exécution dans thread.join(). c'est-à-dire que la taille du nom de la liste est de 3 mais ce thread effectue une action 3 fois aussi. qui est à l'extérieur pour la boucle.

et je commence à ce fil dans une autre méthode comme

switch (element.getKey()) { 
     case A 
      thread = new Thread(action); 
      thread.setName(threadName); 
      thread.start(); 
     break; 

pour une raison quelconque (que je suis incapable de comprendre) le fil court trois fois.

Est-ce qu'il ne fonctionne que lorsque j'appelle la méthode thread.start() ou est-ce qu'il doit faire quelque chose quand d'autres threads attendent ce thread dans la méthode thread.join()? quand ce thread attend dans thread.join(), il ne devrait pas effectuer d'autres actions, non?

MISE À JOUR:

Désolé pour la question claire: Il y a une déclaration d'impression juste après la course()

run() // imprimer une boucle For

Puis, en // effectuer une action il y a une autre instruction d'impression // imprimer B

A et B sont imprimés 3 fois. La seule chose que je pense pour le numéro 3 est parce que la taille de nameList est 3.

+3

Si vous ne recevez pas d'aide bientôt, envisagez de créer et de publier un [sscce] (http://sscce.org) ou un [exemple minimal programme/mcve] (http://stackoverflow.com/help/mcve où vous condensez votre code dans le plus petit bit qui continue à être compilé et exécuté, n'a aucune dépendance externe (comme un lien vers une base de données ou des images), n'a pas de code supplémentaire non pertinent pour votre problème, mais démontre votre problème. –

+0

La question n'est pas claire. Voulez-vous affirmer que la méthode 'run' du thread est exécutée trois fois? Quelle preuve avez-vous pour cela? Avez-vous ajouté une instruction print au début de la méthode 'run' et avez vu sa sortie trois fois? –

+0

Pas besoin de vérifier 'isAlive' du tout. 'join' renvoie immédiatement si le thread est mort. Si ce n'était pas le cas, vous seriez exposé à l'attente dans 'rejoindre 'pour toujours. –

Répondre

0

Deviner: vous mettez que l'enregistrement

if (thread != null) { 
    while (thread.isAlive()) { 
    thread.join(); 
    } 
} 

dans votre code; probablement pour une raison. Dans le cas où cet appel renvoie null, vous sautez de votre boucle for; et alors vous exécuterez l'action suivante. Donc, dans le cas où cette vérification a vraiment du sens; vous devez empêcher de laisser ce niveau de boucle lorsque le thread est null.

+0

Je ne comprends pas le problème, si le 'thread' est nul, alors il n'y a rien à attendre avec ce' name', cette boucle n'a aucun sens après tout. – AxelH

+0

Cela dépend du code qu'il ne montre pas. Il pourrait très bien y avoir une autre boucle à l'extérieur ... simplement un court dans l'obscurité; parfois ils aident et sont acceptés; et parfois ils ne le font pas; alors ils sont supprimés. – GhostCat

+0

Oui, je suis plus préoccupé par la méthode 'switch' ou' getThreadByName' – AxelH