webentwicklung-frage-antwort-db.com.de

Thread nach Namen abrufen

Ich habe eine Multithread-Anwendung und weise jedem Thread einen eindeutigen Namen durch die setName()-Eigenschaft zu. Nun möchte ich, dass die Funktionalität direkt mit ihrem entsprechenden Namen auf die Threads zugreifen kann.

Etwas wie die folgende Funktion:

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

Die obige Funktion überprüft alle laufenden Threads und gibt dann den gewünschten Thread aus der Gruppe der laufenden Threads zurück. Vielleicht ist mein gewünschter Thread unterbrochen, dann funktioniert die obige Funktion nicht. Irgendwelche Ideen, wie man diese Funktionalität einbinden kann? 

23
NullPointer

Sie können alle active - Threads mit ThreadGroup finden:

  • Erhalten Sie die Gruppe Ihres aktuellen Threads
  • Arbeite dich durch die Threadgruppenhierarchie, indem du ThreadGroup.getParent() aufrufst, bis du eine Gruppe mit null übergeordnetem Element findest.
  • Rufen Sie ThreadGroup.enumerate() auf, um alle Threads im System zu suchen.

Der Wert dieses Vorgehens entgeht mir völlig. Was werden Sie möglicherweise mit einem benannten Thread tun? Wenn Sie nicht Thread subclassing sind, sollten Sie Runnable implementieren.

21
parsifal

Eine Wiederholung von Pete's Antwort ..

public Thread getThreadByName(String threadName) {
    for (Thread t : Thread.getAllStackTraces().keySet()) {
        if (t.getName().equals(threadName)) return t;
    }
    return null;
}
19
VicVu

Die HashMap-Idee gefällt mir am besten, aber wenn Sie das Set beibehalten möchten, können Sie das Set durchlaufen, anstatt die Konfiguration in ein Array zu konvertieren:

Iterator<Thread> i = threadSet.iterator();
while(i.hasNext()) {
  Thread t = i.next();
  if(t.getName().equals(threadName)) return t;
}
return null;
6
Pete B.

So habe ich es auf der Grundlage von this gemacht:

/*
    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