2010-09-15 3 views
1

J'ai une application client-serveur et à des fins de test, je dois commencer le client dans une méthode d'essai en appelantJava obtenir thread créé en appelant principale

Client.main(); 

Cela crée un nouveau fil. Maintenant, j'ai besoin d'attendre que ce thread soit terminé avant d'effectuer des assertions dans mon test. Comment savoir quand cela se produit? Sinon, comment puis-je savoir quel thread a été démarré par l'appel (le client peut également créer d'autres threads).

+0

Difficile de répondre sans savoir ce que fait votre «client». – Qwerky

Répondre

6

L'appel main par programme ne démarrera pas un nouveau thread à part. Cela ne se produirait que si la méthode main avait du code pour démarrer explicitement un nouveau thread. Si c'est le cas, vous devez changer Client pour fournir l'accès à ce fil sous une certaine forme, de sorte que vous pouvez appeler join() dessus. (Appel Thread.join() est le moyen standard d'attendre un fil à la fin.)

Est-ce que Client.main() effectuer des tâches autre que de commencer un nouveau thread? Si ce n'est pas le cas, il serait probablement plus simple pour vos tests d'appeler simplement la méthode run() que le nouveau thread finira à exécuter, et de rendre le test mono-thread aussi loin que possible.

+0

Thread.getCurrentThread(). Join(); –

+0

@Suresh: Euh, non. Mauvaise idée. –

+0

Juste pour compléter l'information: Oui, le 'Client' étend' Thread'. Et oui, le 'principal()' fait aussi d'autres choses. Quoi qu'il en soit, vous avez été utile (+1). – Trimack

0

Vous pouvez utiliser join() pour attendre la fin de l'exécution d'un autre thread.

+1

Le problème ici est: vous appelez 'join()' sur une instance de thread et le problème OP est * obtenir * ces instances. –

0

Jamais essayé, mais pourrait travailler dans votre cas particulier. Thread a une metod statique pour obtenir des stacktraces pour tous les threads en direct et avec cette méthode vous obtenez un ensemble d'objets threads. L'appeler avant et après l'appel principal devrait vous permettre d'obtenir des références à toutes les discussions qui ont été créés/commencé alors que la méthode principale exécutée:

Set<Thread> before = Thread.getAllStackTraces().keySet(); 
Client.main(); 
Set<Thread> after = Thread.getAllStackTraces().keySet(); 

Bien sûr, l'identification vos fils est encore plus facile (et plus fiable) si vos threads sont créés avec des ID/noms uniques. Vous pouvez maintenant calculer la différence et appeler join sur tous ces threads. Il peut avoir un effet secondaire mais, comme mentionné ci-dessus, peut aider dans votre cas de test spécifique.

+0

Oui, j'ai aussi pensé à ça. Le problème est, il peut être créé plus de threads dans le main(), donc il ne fonctionnera probablement pas. Merci quand même. – Trimack

+1

Je pensais que vous vouliez attendre * tous * ces threads à compléter ?? Donc, c'est juste un qui vous intéresse? Donnez-lui le nom, récupérez la collection de tous les threads comme mentionné ci-dessus et recherchez le thread (nommé) dans cette collection. rejoignez-le et vous avez terminé. –

Questions connexes