2013-03-12 2 views
20

У меня есть многопоточное приложение, и я назначаю уникальное имя для каждого потока через setName(). Теперь я хочу, чтобы функциональность получала доступ к потокам напрямую с их соответствующим именем.Получить тему по имени

Somethings как следующая функция:

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

Вышеуказанные функции проверяют все запущенные потоки, а затем возвращает нужный поток из множества запущенных потоков. Возможно, мой желаемый поток прерывается, тогда вышеуказанная функция не будет работать. Любые идеи о том, как включить эту функциональность?

+2

Как нити создается? –

+2

Просто сохраните нужные вам потоки в 'HashMap ' по их именам. – millimoose

+0

@JohnVint Темы создаются в другом классе, поэтому я не могу получить к ним доступ напрямую. – NullPointer

ответ

17

Вы можете найти все активные нити с использованием ThreadGroup:

  • Получить группу вашей текущей нити
  • Работа ваш путь вверх по иерархии ThreadGroup по телефону ThreadGroup.getParent() ЕНТ il вы найдете группу с нулевым родителем.
  • Позвоните ThreadGroup.enumerate(), чтобы найти все темы в системе.

Значение этого полностью ускользает от меня ... что вы можете сделать с именованной нитью? Если вы не подклассифицируете Thread, когда вы должны реализовать Runnable (для начала это небрежное программирование).

+0

Один из вариантов использования - это найти локальную переменную нить (что означает, что отражение не может ее получить), определенное в сторонней библиотеке (что означает, что исходный код не может быть легко модифицирован), у которого есть имя, указанное для установки обработчика исключенных исключений (потому что они не смогли разрешить ведение журнала, когда здесь вызывается исключение). Это очень частный случай, но для этой ситуации есть краевые случаи. – Jyro117

+0

В моем случае я использую его для написания модульного теста для отладки потока с подозрением на безопасность потоков. Тема, о которой идет речь, реализует Runnable, но вопрос в следующем: какой альтернативный ответ? Как вы получаете конкретное Runnable по имени? –

5

Мне нравится идея HashMap лучше, но если вы хотите сохранить набор, вы можете перебрать Set, а не через настройки преобразования в массив:

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

Это похоже на приведенный выше пример, не будет работать, если поток прерывается! – NullPointer

12

Итерация ответ Пита ..

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

Может быть много потоков. –

Смежные вопросы