Подтвердить что ты не робот

Отправить тему по названию

У меня многопоточное приложение, и я назначаю уникальное имя для каждого потока через свойство 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;
}

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

4b9b3361

Ответ 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;