Отправить тему по названию
У меня многопоточное приложение, и я назначаю уникальное имя для каждого потока через свойство setName()
. Теперь я хочу, чтобы функциональность получала доступ к потокам напрямую с их соответствующим именем.
Что-то вроде следующей функции:
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;
}
Вышеуказанная функция проверяет все текущие потоки и затем возвращает нужный поток из набора запущенных потоков. Возможно, мой желаемый поток прерывается, тогда вышеуказанная функция не будет работать. Любые идеи о том, как включить эту функциональность?
Ответы
Ответ 1
Вы можете найти все активные потоки, используя ThreadGroup:
- Получить текущую группу потоков
- Поверните иерархию нитейгруппы, вызвав
ThreadGroup.getParent()
, пока не найдете группу с нулевым родителем.
- Вызовите
ThreadGroup.enumerate()
, чтобы найти все потоки в системе.
Значение этого полностью ускользает от меня... что вы можете сделать с именованным потоком? Если вы не подклассифицируете Thread
, когда вы должны внедрять Runnable
(для начала это небрежное программирование).
Ответ 2
Итерация Пита отвечает.
public Thread getThreadByName(String threadName) {
for (Thread t : Thread.getAllStackTraces().keySet()) {
if (t.getName().equals(threadName)) return t;
}
return null;
}
Ответ 3
Мне нравится идея HashMap лучше всего, но если вы хотите сохранить Set, вы можете выполнять итерацию по набору, а не проходить через преобразование в массив:
Iterator<Thread> i = threadSet.iterator();
while(i.hasNext()) {
Thread t = i.next();
if(t.getName().equals(threadName)) return t;
}
return null;