Полагаю, самая сложная часть - это определить висящую нить. Вы не предоставляете информацию об этом, но, возможно, вы можете построить некоторые правила вокруг имени потока или его текущей трассировки стека.
Если вы можете идентифицировать поток по его имени, я бы получил все потоки в ВМ, получив собственную группу потоков с Thread.currentThread().getThreadGroup()
, а затем поднялся бы по иерархии групп потоков, вызывая getParent()
в группе потоков, пока возвращает null
. Теперь у вас есть группа потоков верхнего уровня. Теперь вы можете заполнить предварительно выделенный массив всеми потоками, используя метод enumerate(Thread[] list)
в группе потоков верхнего уровня.
Если вам все равно нужны трассировки стека для идентификации потока, вы также можете использовать метод статической утилиты Map<Thread,StackTraceElement[]> Thread.getAllStackTraces()
, чтобы получить все потоки. Однако вычисление трассировки стека довольно дорого, так что это может быть не лучшим решением, если вы на самом деле не нужны.
После идентификации потока вы должны вызвать для него метод stop()
. Прерывание не поможет, если реализация работающего кода фактически не оценивает флаг прерывания потока и ведет себя так, как вы ожидаете. Нельзя сказать, что метод stop()
устарел и что его использование может иметь много забавных побочных эффектов. Вы можете найти более подробную информацию в документации API.