web-dev-qa-db-fra.com

Obtenir le fil par nom

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é? 

23
NullPointer

Vous pouvez trouver tous les threads actifs en utilisant ThreadGroup :

  • Obtenez le groupe de votre fil actuel
  • Travaillez dans la hiérarchie des groupes de threads en appelant ThreadGroup.getParent() jusqu'à ce que vous trouviez un groupe avec un parent nul.
  • Appelez 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).

21
parsifal

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;
}
19
VicVu

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;
6
Pete B.

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;
}
0
vyrwu