2013-03-12 16 views
20

Mam aplikację wielowątkową i przypisuję unikalną nazwę do każdego wątku za pośrednictwem właściwości setName(). Teraz chcę funkcjonalność, aby uzyskać dostęp do wątków bezpośrednio z ich odpowiednią nazwą.Pobierz wątek według nazwy

Coś jak następującej funkcji:

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

Powyższe kontroli działania wszystkich wątków uruchomione i występuje ponownie żądaną gwint ze zbioru prowadzących nici. Może mój pożądany wątek zostanie przerwany, a powyższa funkcja nie zadziała. Wszelkie pomysły na włączenie tej funkcjonalności?

+2

Jak nici powstaje? –

+2

Po prostu zapisz potrzebne ci w "HashMap " według ich nazw. – millimoose

+0

@JohnVint Wątki tworzone w innej klasie, dlatego nie mogę uzyskać do nich bezpośredniego dostępu. – NullPointer

Odpowiedz

17

Można znaleźć wszystko aktywnych gwinty ThreadGroup:

  • Get grupować bieżącego wątku za
  • swój sposób pracy hierarchię threadgroup wywołując ThreadGroup.getParent() unt il znajduje się grupa z zerowym rodzicem.
  • Zadzwoń pod numer ThreadGroup.enumerate(), aby znaleźć wszystkie wątki w systemie.

Wartość tego zupełnie mi umyka ... co zrobisz z nazwanym wątkiem? Chyba że podklasujesz Thread, kiedy powinieneś implementować Runnable (na początku to niechlujne programowanie).

+0

Jednym z przykładów użycia jest znalezienie wątku zmiennej lokalnej (co oznacza, że ​​odbicie nie może się do niego dostać) zdefiniowanego w bibliotece innej firmy (co oznacza, że ​​kodu źródłowego nie można w łatwy sposób modyfikować), który ma nazwę określoną dla ustawienia nieprzechwyconego menedżera wyjątków (ponieważ nie zezwalają na rejestrowanie, gdy zgłoszony zostanie wyjątek). Jest to bardzo szczególny przypadek, ale istnieją skrajne przypadki w tej sytuacji. – Jyro117

+0

W moim przypadku używam go do napisania testu jednostkowego w celu debugowania wątku z podejrzeniem problemu z bezpieczeństwem wątków. Wątek, o którym mowa, implementuje Runnable, ale pytanie brzmi: jaka jest alternatywna odpowiedź? Jak uzyskać konkretny Runnable według nazwy? –

5

podoba mi się pomysł HashMap najlepiej, ale jeśli chcesz zachować zestawie, można iteracyjne nad Set, zamiast przechodzenia przez konfiguracji konwersji do tablicy:

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

To jak w powyższym przykładzie, nie zadziała, jeśli wątek zostanie przerwany! – NullPointer

12

Iteracja odpowiedzi Pete'a ..

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

Może być wiele wątków. –

Powiązane problemy