2009-08-29 9 views

Répondre

11

Cela pourrait ou non aider, selon votre cas d'utilisation.

Définir vos fil de boucle en mode démon

setDaemon(true); 

et Java pour vous tuer si tous les fils non-démon ont disparu.

+0

+1 Je pense que c'est ce qu'il cherche. – James

+0

+1 aime aussi cette solution. très élégant. – Nico

3

Est-ce que ce ne serait pas une situation où vous envisageriez le Thread Pool Pattern?

Si ce n'est pas le cas, ne serait-il pas préférable de maintenir une liste de threads actifs, en supprimant chacun d'eux car ils sont détruits?

+0

Peut-être, laissez-moi savoir comment cela m'aide. –

+1

Si vous faites référence au Pattern ThreadPool, allez sur le lien et lisez pourquoi vous l'utiliseriez ... Si vous voulez parler du tableau, n'est-ce pas évident? Vous devez ajouter chaque thread dans le tableau lorsque vous les démarrez et les supprimer lorsque vous les détruisez. Par conséquent, vous avez un tableau de discussions actives. Donc, si array.count = 1 alors vous savez que c'est le dernier thread actif. – James

+0

OK, je vais utiliser une liste. Je suis toujours curieux s'il y a un moyen sans la tenue de livres. –

1

ThreadGroup a les méthodes dont vous avez besoin. Ce sera plus facile si vous pouvez créer tous les threads dans le même ThreadGroup, mais ce n'est pas vraiment nécessaire. Thread.currentThread(). GetThreadGroup() vous aidera à démarrer. Les méthodes enumerate sur ThreadGroup sont comment vous pouvez obtenir la liste de tous les threads.

+0

L'API ThreadGroup est problématique. Pour un exemple, voir "Effective Java" de Josh Bloch (recherchez "groupe de threads efficace java" sur Google Books pour voir la page en question, l'URL est trop longue pour être collée ici). La méthode Enumerate, par exemple, n'est pas sensible aux threads (!). Dans ce cas, vous savez probablement combien il y a de Threads, donc le problème de dimensionnement de tableau décrit par Bloch ne sera probablement pas un problème, mais c'est quand même une API bizarre. – Cowan

0

Utilise Executors et invokeAll une option? C'est à dire. pouvez-vous implémenter votre fonctionnalité en tant que Callables?

Ensuite, il est trivial simple à faire.

0

Vous pouvez pirater quelque chose ensemble en utilisant un ThreadFactory et assurez-vous simplement d'enregistrer tous les threads dans un WeakHashMap. Effectuez une itération sur la carte pour voir quels sont les threads en vie.

Une autre approche possible - utiliser un ThreadJMXBean?

+0

Pourquoi répondez-vous aux questions de 3 ans? Je n'ai aucune idée de ce que j'essayais de faire en 2009! :) –

Questions connexes