Вы действительно можете получить трассировку стека всех запущенных потоков, выгруженных в стандартный вывод, используя kill -QUIT <pid>
в * NIX-подобной ОС или запустив приложение в консоли Windows и нажав Ctrl-Pause
(как отмечает другой участник). )
Тем не менее, похоже, что вы запрашиваете программные способы сделать это. Итак, если вы действительно хотите, чтобы набор всех потоков, в которые текущие стеки вызовов включены один или несколько методов из данного класса ...
Лучшее, что я могу найти, если не задействовать вызовы в JVMTI, - это проверить стеки всех запущенных потоков. Я не пробовал это, но это должно работать в Java 1.5 и позже. Имейте в виду, что это, по определению, не ВСЕ потокобезопасен (список запущенных потоков - и их текущие трассировки стека - будут постоянно меняться под вами ... много параноидальных вещей было бы необходимо для реального использования этого списка.)
public Set<Thread> findThreadsRunningClass(Class classToFindRunning) {
Set<Thread> runningThreads = new HashSet<Thread>();
String className = classToFindRunning.getName();
Map<Thread,StackTraceElement[]> stackTraces = Thread.getAllStackTraces();
for(Thread t : stackTraces.keySey()) {
StackTraceElement[] steArray = stackTraces.get(t);
for(int i = 0;i<steArray.size();i++) {
StackTraceElement ste = steArray[i];
if(ste.getClassName().equals(className)) {
runningThreads.add(t);
continue;
}
}
}
return runningThreads;
}
Дайте мне знать, если этот подход сработает для вас!