Потоки Java: выясните, какие потоки все еще работают - PullRequest
3 голосов
/ 07 декабря 2010

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

Ответы [ 5 ]

5 голосов
/ 07 декабря 2010

Используйте инструмент командной строки jps для просмотра активных процессов Java и jstack для отображения активных потоков.

jstack doc

пример

3 голосов
/ 07 декабря 2010

Если вы ищете программное решение, что-то вроде этого (в JDK 1.5 или более поздней версии) должно работать:

Map<Thread, StackTraceElement[]> stack = Thread.getAllStackTraces();
for (Map.Entry<Thread, StackTraceElement[]> entry : stack.entrySet()) {
    System.out.println("Thread named '" + 
                       entry.getKey().getName() + 
                       "' is alive");
}
3 голосов
/ 07 декабря 2010

jVisualVM - ваш друг для такого рода отладки. Он находится в каталоге / bin вашей установки JDK. Показывает все потоки в виде графика и позволяет углубиться в то, что они делают. Кнопка Thread Dump напечатает все их текущие трассировки стека, чтобы вы могли увидеть, не застряло ли что-нибудь в вашем коде пользователя.

1 голос
/ 07 декабря 2010

После ответа nogudnik, tempus-fugit имеет функцию программного дампа потока (и обнаружения взаимоблокировок), см. http://tempusfugitlibrary.org/documentation/threading/dumps/

0 голосов
/ 10 июня 2012

"Кажется, есть один или несколько потоков, которые случайно не были прерваны". Я не сказал, что вещи не были прерваны. Вызов Thread.interrupt () не заставляет runnable остановиться. Он устанавливает флаг прерывания и, возможно, заставляет блокирующие операции (например, вызовы Thread.sleep или java.nio) генерировать либо InterruptedException, либо какое-либо другое исключение (например, ClosedByInterruptException для nio). Ваши runnables должны проверить Thread.currentThread (). IsInterrupted () и вести себя хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...