J'ai une application multithread et j'attribue un nom unique à chaque thread via la propriété setName()
. Maintenant, je veux que les fonctionnalités obtiennent un accès direct aux discussions avec leur nom correspondant.
Quelque chose comme la fonction suivante:
public Thread getThreadByName(String threadName) {
Thread __tmp = null;
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]);
for (int i = 0; i < threadArray.length; i++) {
if (threadArray[i].getName().equals(threadName))
__tmp = threadArray[i];
}
return __tmp;
}
La fonction ci-dessus vérifie tous les threads en cours d'exécution, puis renvoie le thread souhaité à partir de l'ensemble des threads en cours d'exécution. Peut-être que mon thread souhaité est interrompu, alors la fonction ci-dessus ne fonctionnera pas. Des idées sur la façon d'intégrer cette fonctionnalité?
Vous pouvez trouver tous les threads actifs en utilisant ThreadGroup :
ThreadGroup.getParent()
jusqu'à ce que vous trouviez un groupe avec un parent nul.ThreadGroup.enumerate()
pour rechercher tous les threads du système.La valeur de faire cela m'échappe complètement ... que ferez-vous éventuellement avec un fil nommé? Sauf si vous sous-classez Thread
quand vous devriez implémenter Runnable
(ce qui est une programmation bâclée pour commencer).
Une itération de la réponse de Pete ..
public Thread getThreadByName(String threadName) {
for (Thread t : Thread.getAllStackTraces().keySet()) {
if (t.getName().equals(threadName)) return t;
}
return null;
}
J'aime mieux l'idée de HashMap, mais si vous souhaitez conserver l'ensemble, vous pouvez effectuer une itération sur l'ensemble, plutôt que de passer par la configuration de la conversion en tableau:
Iterator<Thread> i = threadSet.iterator();
while(i.hasNext()) {
Thread t = i.next();
if(t.getName().equals(threadName)) return t;
}
return null;
Voilà comment je l'ai fait sur la base de this :
/*
MIGHT THROW NULL POINTER
*/
Thread getThreadByName(String name) {
// Get current Thread Group
ThreadGroup threadGroup = Thread.currentThread().getThreadGroup();
ThreadGroup parentThreadGroup;
while ((parentThreadGroup = threadGroup.getParent()) != null) {
threadGroup = parentThreadGroup;
}
// List all active Threads
final ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
int nAllocated = threadMXBean.getThreadCount();
int n = 0;
Thread[] threads;
do {
nAllocated *= 2;
threads = new Thread[nAllocated];
n = threadGroup.enumerate(threads, true);
} while (n == nAllocated);
threads = Arrays.copyOf(threads, n);
// Get Thread by name
for (Thread thread : threads) {
System.out.println(thread.getName());
if (thread.getName().equals(name)) {
return thread;
}
}
return null;
}